在其他屏幕上更新绑定后,SwiftUI列表行未刷新

时间:2020-01-30 14:36:15

标签: ios swift state swiftui watchos

我有一个简单的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”。

有人知道我在这里做错了吗,还是我可能遇到了错误?

谢谢!

1 个答案:

答案 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]
  [...]
}