我正在尝试使我的应用程序内容保持反应性并与远程数据保持同步。我的价值观是使用 a 来探索的NavigationLink
,但是当我深入 2 页并且原始项目消失时,SwiftUI 会崩溃。
开始:
class App: ObservableObject {
@Published var items: [Item] = [
Item(id: "a", accounts: [
Account(id: "1"),
Account(id: "2"),
Account(id: "3")
])
]
}
struct AllItems: View {
@EnvironmentObject var app: App
var body: some View {
ForEach(app.items.indices, id: \.self) { index in
NavigationLink(destination: ItemView(item: self.$app.items[index])) {
Text(self.app.items[index].id)
}
}
}
}
struct ItemView: View {
@Binding var item: Item
var body: some View {
ForEach(item.accounts.indices, id: \.self) { index in
NavigationLink(destination: AccountView(item: self.$item.accounts[index])) {
Text(self.item.accounts[index].id)
}
}
}
}
struct AccountView: View {
@Binding var account: Account
var body: some View {
Text(account.id)
}
}
但是,如果我在 AccountView 页面上并items
变为空,则应用程序将因“致命错误:索引超出范围”而崩溃。
我最初没有使用绑定,但是当 Account 结构的内容发生更改时,AccountView 没有更新,视图没有更改。现在通过传递绑定,视图确实会正确更新,但如果列表大小发生变化,它可能会导致崩溃。