微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更新SwiftUI列表中的选定对象

如何解决更新SwiftUI列表中的选定对象

当使用List是SwiftUI时,我有代码来更新选定的对象,它工作正常。但是,直到所选对象发生更改,对所选对象的更改才会反映在列表中。

这是我的列表正在显示的类的简化版本。

class Item: ObservableObject {
    let id = UUID()
    @Published var name: String
    
    init(name: String) {
        self.name = name
    }
}

extension Item: Hashable {
    static func == (lhs: Item,rhs: Item) -> Bool {
        lhs.id == rhs.id
    }
    
    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }
}

这是我的观点的简化版本。

struct TestView: View {
    @State var items = [
        Item(name: "Item 1"),Item(name: "Item 2"),Item(name: "Item 3"),Item(name: "Item 4")
    ]
    @State var selectedItem: Item?
    
    var body: some View {
        vstack {
            List(items,id: \.self,selection: $selectedItem) { item in
                Text(item.name)
            }
            
            HStack {
                Button { items.append(Item(name: "New Item")) }
                    label: { Text("Add Item") }
                
                Button { selectedItem?.name += "a" }
                    label: { Text("Update Item") }
                    .disabled(selectedItem == nil)
            }
        }
        .padding()
    }
}

我打算使用范围0..<items.count并更新数组中的对象,但是,当项目数更改时,这会崩溃。

屏幕录像:

Screen recording

解决方法

由于您的项目具有引用类型(class Item),因此在修改每个对象时不会更改State数组中的引用,因此不会刷新视图。

您的模型可能的解决方案是将列表行分为独立的视图,以观察相应的项目更改

通过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)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。