SwiftUI Могу ли я использовать Binding для установки настраиваемой привязки с оболочкой свойств @Binding?
Как я могу использовать Binding(get: { }, set: { })
пользовательская привязка с @Binding
свойство в представлении SwiftUI. Я успешно использовал эту настраиваемую привязку с@State
переменная, но не знает, как ее применить к @Binding
в инициализаторе подпредставления. Мне это нужно, чтобы увидеть изменения, назначенные@Binding
родительским классом, чтобы выполнить код с некоторыми побочными эффектами!
1 ответ
Вот возможный подход. Демонстрация показывает двунаправленный канал через привязку адаптера между основным и зависимым представлениями. Из-за множества возможных обратных вызовов при обновлении может потребоваться ввести фильтрацию избыточности, но это зависит от того, что действительно требуется и выходит за рамки.
Демо-код:
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()
}
}