更新SwiftUI列表中的选定对象
当使用列表是SwiftUI时,我有代码来更新所选对象,效果很好。但是,在选定对象发生更改之前,对选定对象的更改不会反映在列表中 下面是我的列表显示的类的简化版本更新SwiftUI列表中的选定对象,swift,swiftui,swiftui-list,Swift,Swiftui,Swiftui List,当使用列表是SwiftUI时,我有代码来更新所选对象,效果很好。但是,在选定对象发生更改之前,对选定对象的更改不会反映在列表中 下面是我的列表显示的类的简化版本 类项:ObservableObject{ 设id=UUID() @已发布变量名称:String init(名称:String){ self.name=名称 } } 扩展项:可哈希{ 静态函数==(左:项,右:项)->Bool{ lhs.id==rhs.id } func散列(放入散列程序:inout散列程序){ hasher.combi
类项:ObservableObject{
设id=UUID()
@已发布变量名称:String
init(名称:String){
self.name=名称
}
}
扩展项:可哈希{
静态函数==(左:项,右:项)->Bool{
lhs.id==rhs.id
}
func散列(放入散列程序:inout散列程序){
hasher.combine(id)
}
}
这是我观点的简化版本
struct TestView:View{
@状态变量项=[
项目(名称:“项目1”),
项目(名称:“项目2”),
项目(名称:“项目3”),
项目(名称:“项目4”)
]
@状态变量selectedItem:Item?
var body:一些观点{
VStack{
列表(项目,id:\.self,选择:$selectedItem){item in
文本(项目名称)
}
HStack{
按钮{items.append(Item(名称:“newitem”))}
标签:{Text(“添加项”)}
按钮{selectedItem?.name+=“a”}
标签:{Text(“更新项”)}
.disabled(selectedItem==nil)
}
}
.padding()
}
}
我打算使用范围
0..,因为您的项目具有引用类型(class Item
),修改每个对象时,状态数组中的引用不会更改,因此视图不会刷新
模型的可能解决方案是将列表行分隔为独立视图,以观察相应的项更改
使用Xcode 11.4/macOS 10.15.6进行测试
struct ListRowView: View {
@ObservedObject var item: Item
var body: some View {
Text(item.name)
}
}
所以主列表变为
List(items, id: \.self, selection: $selectedItem) { item in
ListRowView(item: item)
}
您不希望对项目数组使用@State
,而是希望使用@ObservedObject
,因为项目
是一个可观察对象
,其名称
作为其@Published
属性。@MStrapko不幸的是,这不适用于,因为数组本身不符合ObservedObject(事实上,它本身是一个结构而不是一个类)。啊,天才!我从来没有想过我可以用@ObservedObject
来表示数组中的对象。