【问题标题】:SwiftUI Lists & OnAppearSwiftUI 列表和 OnAppear
【发布时间】:2022-01-26 23:10:04
【问题描述】:

我注意到列表视图的 OnAppear 事件有一些奇怪的行为。我认为 OnAppear 闭包会在屏幕上出现视图时运行,但在加载 List 时它似乎会立即运行。

例如下面的代码:

@State var rows: [String] = Array(repeating: "Item", count: 20)

var body: some View {

    List(0..<rows.count, id: \.self) { index in
        Text(verbatim: self.rows[index])
            .onAppear {
                print("BOOOOM")
            }
            .frame(height:400)
    }
}

...我希望打印命令在加载时运行几次,然后在我向下滚动时继续打印。相反,它一次打印 20 次,然后在我开始向下滚动时再次打印。

有什么想法吗?

【问题讨论】:

    标签: swiftui swiftui-list


    【解决方案1】:

    我认为它的行为符合预期。

    对我来说,它在带有iPhone 7 的模拟器上打印了 15 次,在带有 iPhone 11 的模拟器上全部打印了 20 次。

    我对@9​​87654323@做了一点改动

    列表在后台遵守的性能和资源可能存在平衡。

    加载太少,如果滚动太快与加载太多并减慢滚动动画,用户将“卡住”。

    【讨论】:

      【解决方案2】:

      这已经是我众所周知的一个月里的一根刺了

      我无法解释为什么会发生这种情况,但这与 iOS 14 中的列表和自定义单元格高度有关。如果您删除.frame(height: 400),您会注意到“Boom”的打印次数正确。当您的单元格高度扩大到超出普通标签时,iOS 仍会加载相同数量的单元格,但随后会回溯屏幕外的单元格(查看 .onDisappar() 视图修饰符)。

      你能做什么?

      1.更新到 iOS 15

      这种行为在 iOS 15 和 13 中是正确的,所以如果可以的话,只需提高你的最低部署目标并告别 iOS 14

      2。切换到LazyVStack

      正如他们的名字一样:LazyVStackLazyVGrid 不会做任何超出他们必须做的事情,并且会“繁荣”正确的次数。缺点是你失去了对 iOS 13 的兼容性,以及 List 附带的所有自动布局魔法

      如果您后来找到了让 onAppear() 在 iOS 14 的 List 中正常工作的方法,请告诉我

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 2020-11-29
        相关资源
        最近更新 更多