尝试使用 SwiftUI 进行开发,我浏览了 Landmarks 教程,现在正尝试将我学到的知识应用到我自己的示例中。
我实现了一个简单的列表列表-详细信息视图组合,现在还想添加一个删除选项。这在刚访问列表后删除时工作正常。但是,如果我先访问要删除的项目的详细信息视图,则应用程序会在详细信息视图中遇到 nil 崩溃。
代码如下(我试图展示相关部分,但如果我可能需要提供更多信息,请告诉我)。
列表视图
struct ShopprList: View {
@EnvironmentObject var modelData: ModelData
var shopprItems: [ShopprItem] {
modelData.shopprItems
}
var body: some View {
NavigationView {
List {
ForEach(shopprItems) { shopprItem in
NavigationLink(destination: Detail(shopprItem: shopprItem)) {
ShopprRow(shopprItem: shopprItem)
}
}
.onDelete(perform: delete)
}
.navigationTitle("Shopping List")
}
}
func delete(at offsets: IndexSet) {
modelData.shopprItems.remove(atOffsets: offsets)
}
}
Detail 视图如下
struct Detail: View {
@EnvironmentObject var modelData: ModelData
var shopprItem: ShopprItem
var shopprItemIndex: Int {
//the following line crashes following the delete with shopprItem being nil, I suppose
modelData.shopprItems.firstIndex(where: { $0.id == shopprItem.id })!
}
...
ModelData 包含 shopprItems 作为 @Published 对象
final class ModelData: ObservableObject {
@Published var shopprItems: [ShopprItem] = load("dummyData.json")
}
...
我觉得,在离开详细视图或执行删除以将项目标记为已删除时,缺少一些清理代码,但在文档中没有找到任何相关内容。
需要注意的是,数据尚未(尚未)持久化,我目前正在使用来自 json 脚本的一组静态项目初始化应用程序。下一步就是坚持。
任何提示将不胜感激。