SwiftUI 我可以使用 Binding 获取带有 @Binding 属性包装器的自定义绑定吗?

Mic*_*bro 4 binding swiftui property-wrapper

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

Asp*_*eri 15

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

演示代码:

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()
    }
}
Run Code Online (Sandbox Code Playgroud)