SwiftUI извлекает данные из вложенного представления - PullRequest
1 голос
/ 09 апреля 2020

У меня есть текстовые поля с глубиной просмотра пары. Я пытаюсь получить данные для отправки на сервер. Кто-нибудь нашел пример извлечения данных, которые глубоко вложены в представления?

Вот структура этой функции ..

символ:> NavigationLink

символ: ~ Subview

HostingViewController ~ CustomListView> FormTypeView> BuildFormView (построенный здесь ObservedObject) ~ ViewPagerView (горизонтальный список просмотров страниц) ~ FourItemCardView ~ TextFieldInputView.

Структура альтернативной структуры , чтобы помочь объяснить

- HostingViewController ~ CustomListView

     - FormTypeView

         - BuildFormView ~ ViewPagerView ~ FourItemCardView ~ TextFieldInputView

Когда вы нажимаете «Добавить» в ListView, вы выбираете тип формы, а затем BuildFormView создает пейджер с возможностью просмотра нескольких карт. Это встроено в ObservableObject.

В идеальном мире все мои данные будут привязаны к ..

@Published var pageCells: [PageViewCell] = [PageViewCell]()

Где я мог бы вызвать их в buildFormData1 () ..

* 1024 ObservableObject *

Мне удалось связать представление в swiftui и выполнить обратные вызовы при нажатии кнопки, но связывание представления или обратного вызова на 2-3 уровнях, похоже, не работает.

Я пробовал EnvironmentalObject, какой брейки. Я не могу использовать его в SceneDelegate, так как у меня есть HostingViewController в раскадровке. Я могу определить, где я подключаю CustomListView к HostingViewController, но это дает сбой (не могу вспомнить причину из моей головы). Даже если это сработает, получить данные, указанные c, будет сложно. Поскольку мой пейджер представления динамически изменяется, я не могу индивидуально определить каждую переменную в своем ObservedObject.

Кто-нибудь нашел пример извлечения данных, которые глубоко вложены? Я не могу избежать вложения, потому что SwiftUI ломается (ошибочная ошибка), когда у вас слишком много просмотров. Также дайте мне знать, какой код отправлять, поскольку есть тонна, которую я мог бы опубликовать, что может усложнить этот вопрос.

1 Ответ

1 голос
/ 09 апреля 2020

Здесь возможен подход, основанный на предпочтениях вида. Демонстрация воспроизводит простую иерархию для последних четырех представлений и показывает, как перенести текст, введенный в последнем представлении, в самый верхний вид иерархии.

demo

// Models
struct TextValueKey: PreferenceKey {       // view pref for transfer
    static var defaultValue: String = ""

    static func reduce(value: inout String, nextValue: () -> String) {
        value = nextValue()
    }
}

class BuildFormViewModel: ObservableObject { // view model on top
    @Published var value: String = ""
}

// Views
struct BuildFormView: View {
    @ObservedObject var vm = BuildFormViewModel()
    var body: some View {
        VStack {
            Text("Current: \(vm.value)")
            Divider()
            FourItemCardView()
                .onPreferenceChange(TextValueKey.self) { 
                   self.vm.value = $0       // consume value
                }
        }
    }
}

struct ViewPagerView: View {
    var body: some View {
        FourItemCardView()
    }
}

struct FourItemCardView: View {
    var body: some View {
        TextFieldInputView()
    }
}

struct TextFieldInputView: View {
    @State private var text: String = ""
    var body: some View {
        TextField("Placeholder", text: $text)
            .textFieldStyle(RoundedBorderTextFieldStyle()).padding()
            .preference(key: TextValueKey.self, value: text)  // inject value
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...