Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新SwiftUI列表中的选定对象_Swift_Swiftui_Swiftui List - Fatal编程技术网

更新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

当使用列表是SwiftUI时,我有代码来更新所选对象,效果很好。但是,在选定对象发生更改之前,对选定对象的更改不会反映在列表中

下面是我的列表显示的类的简化版本

类项: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
来表示数组中的对象。