我有一个简单的watchOS SwiftUI应用程序。该应用程序具有三个屏幕。第一个屏幕包含List
个项目。当您按下该项目时,它将重定向到另一个屏幕,而当您点击按钮时,它将打开一个.sheet
View
,可让您编辑列表中的项目。
第一个视图如下:
class Object: NSObject {
var title: String
init(title: String) {
self.title = title
}
}
struct Row: View {
@Binding var object: Object
var body: some View {
Text(self.object.title)
}
}
struct ContentView: View {
@State private var objects = [Object]()
var body: some View {
NavigationView {
List {
ForEach(objects.indices, id: \.self) { idx in
NavigationLink(destination: SecondView(object: self.$objects[idx])) {
Row(object: self.$objects[idx])
}
}
}
}
.onAppear {
self.objects = [
Object(title: "Test 1"),
Object(title: "Test 2")
]
}
}
}
这些是第二视图和第三视图:
struct SecondView: View {
@Binding var object: Object
@State private var showPicker: Bool = false
var body: some View {
VStack {
Text(object.title)
Button(action: {
self.showPicker.toggle()
}) {
Text("Press Here")
}
}
.sheet(isPresented: $showPicker) {
ThirdView(object: self.$object)
}
}
}
struct ThirdView: View {
@Binding var object: Object
var body: some View {
VStack {
Text(object.title)
Button(action: {
self.update()
}, label: {
Text("Tap here")
})
}
}
func update() {
let newObj = self.object
newObj.title = "Hello, World!"
self.object = newObj
}
}
我希望每当我在第三视图中点击按钮时,Binding
(以及State
)就会被更新为“ Hello,World”。但是,不是那样,尽管不是立即。
我目前看到的是,当我在第三视图中点击按钮时,该视图中的Text
并没有被更新。当我关闭第三个视图并返回第二个视图时,我确实看到了“ Hello,World”。但是当我返回列表时,该行仍然具有旧值。
我注意到的另一件事是,当我直接填充对象数组时,就像这样:
@State private var objects = [Object(title: "Test 1"), Object(title: "Test 2")]
并删除.onAppear
中数组的填充,这完全符合我的期望(所有内容都会立即更新为“ Hello,World”。
有人知道我在这里做错了吗,还是我可能遇到了错误?
谢谢!
答案 0 :(得分:0)
复杂对象必须是符合@ObservableObject
的类。
观察到的ivars需要发布。
class Object: ObservableObject {
@Published var title: String
[...]
}
观察视图会将它们用作@ObservedObject
struct Row: View {
@ObservedObject var object: Object
[...]
}
您可能必须为列表创建一个对象包装器
class ObjectList: ObservableObject {
@Published var objects: [Object]
[...]
}