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