代码在macOS上运行良好,不会';无法在iOS(SwiftUI)上工作
下面的代码在macOS上运行良好(至少Catalina 10.15.3),但同样的代码(只是复制粘贴)在iOS模拟器(13.2.2/13.3)和Xcode 11.3.1预览版(应用程序只是崩溃)上不起作用。有人能解释一下我做错了什么吗 问题就在这里:代码在macOS上运行良好,不会';无法在iOS(SwiftUI)上工作,ios,macos,swiftui,Ios,Macos,Swiftui,下面的代码在macOS上运行良好(至少Catalina 10.15.3),但同样的代码(只是复制粘贴)在iOS模拟器(13.2.2/13.3)和Xcode 11.3.1预览版(应用程序只是崩溃)上不起作用。有人能解释一下我做错了什么吗 问题就在这里:.onAppear(perform:self.initView)(在更新用户属性时),但我不知道出了什么问题 struct User: Identifiable { let id = UUID() let name: String }
.onAppear(perform:self.initView)
(在更新用户
属性时),但我不知道出了什么问题
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")]
}
}
使用Xcode 11.2/iOS 13.2没有崩溃在模拟器上使用Xcode 11.3/iOS 13.3确认崩溃(在预览中没有崩溃),感谢您的帮助和清晰的解释。但我想知道,为什么我上面的代码可以在macOS上运行而不延迟…剩下的唯一问题是,当代码更改时预览不会更新(Xcode 11.3.1/iOS 13.3)。但在模拟器上,它不会崩溃。是否有可能修复或预览不适用于延迟?@Mikk,静态预览不跟踪异步更改,但它在LivePreview中工作。