繁体   English   中英

代码在 macOS 上运行良好,在 iOS (SwiftUI) 上不起作用

[英]Code works well on macOS and doesn't work on iOS (SwiftUI)

下面的代码在 macOS(至少是 Catalina 10.15.3)上运行良好,但相同的代码(只是复制粘贴)在 iOS Simulator (13.2.2/13.3) 和 Xcode 11.3.1 预览版(应用程序崩溃)上不起作用。 有人可以解释一下,我做错了什么吗?

问题在这里: .onAppear(perform: self.initView) (关于更新users属性),但我不知道,出了什么问题。

struct User: Identifiable {
    let id = UUID()
    let name: String
}

struct ContentView: View {
    @State var users = [User]()
    var body: some View {
        List(users, id: \.id) { user in
            Text(user.name)
        }.onAppear(perform: self.initView)
    }

    func initView() {
        self.users = [User(name: "test")]
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这是生成的崩溃日志中非常有用的部分:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节数无效。 更新后表视图中包含的节数(1)必须等于更新前表视图中包含的节数(1),加上或减去插入或删除的节数(1插入,0已删除)。”

所以这意味着表数据的更新存在一些偏差(即,实际上,在重新加载数据期间),在这种情况下,根据经验,有理由推迟执行的操作......而且,它也适用于这种情况。

这是一个有效的修复(或解决方法,无论如何)。 使用 Xcode 11.3 / iOS 13.3 测试

func initView() {
    DispatchQueue.main.async { // postponed update till next event cycle
        self.users = [User(name: "test")]
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM