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()
    }
}
Другие вопросы по тегам