更新 SwiftUI 列表中的选定对象
Updating the selected object in a SwiftUI List
当使用 SwiftUI 列表时,我有更新所选对象的代码,效果很好。但是,在所选对象更改之前,对所选对象的更改不会反映在列表中。
这是 class 我的列表显示的简化版本。
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
并更新数组中的对象,但是当项目数量改变时这会崩溃。
屏幕录制:
由于您的项目具有引用类型 (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)
}
当使用 SwiftUI 列表时,我有更新所选对象的代码,效果很好。但是,在所选对象更改之前,对所选对象的更改不会反映在列表中。
这是 class 我的列表显示的简化版本。
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
并更新数组中的对象,但是当项目数量改变时这会崩溃。
屏幕录制:
由于您的项目具有引用类型 (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)
}