5

如何在 SwiftUI 视图上使用Binding(get: { }, set: { })带有属性的自定义绑定。@Binding我已经成功地将这个自定义绑定与@State变量一起使用,但不知道如何@Binding在子视图初始化程序中应用它。我需要它来观察@Binding父类分配给属性的更改,以便执行具有一些副作用的代码!

4

1 回答 1

17

这是可能的方法。该演示显示了通过主视图和依赖视图之间的适配器绑定的双向通道。由于许多可能的更新回调,可能需要引入冗余过滤,但这取决于真正需要的内容和超出范围的内容。

演示代码:

struct TestBindingIntercept: View {

    @State var text = "Demo"
    var body: some View {
        VStack {
            Text("Current: \(text)")
            TextField("", text: $text)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            Divider()
            DependentView(value: $text)
        }
    }
}

struct DependentView: View {
    @Binding var value: String

    private var adapterValue: Binding<String> {
        Binding<String>(get: {
            self.willUpdate()
            return self.value
        }, set: {
            self.value = $0
            self.didModify()
        })
    }

    var body: some View {
        VStack {
            Text("In Next: \(adapterValue.wrappedValue)")
            TextField("", text: adapterValue)
                .textFieldStyle(RoundedBorderTextFieldStyle())
        }
    }

    private func willUpdate() {
        print(">> run before UI update")
    }

    private func didModify() {
        print(">> run after local modify")
    }
}

struct TestBindingIntercept_Previews: PreviewProvider {
    static var previews: some View {
        TestBindingIntercept()
    }
}
于 2019-12-13T07:45:52.240 回答