【问题标题】:SwiftUI Pull Data from Nested ViewSwiftUI 从嵌套视图中提取数据
【发布时间】:2020-07-22 07:37:28
【问题描述】:

我有几个视图深度的文本字段。我正在尝试提取输入的数据以发送到服务器。有没有人找到一个提取嵌套在视图中的数据的示例?

这是此功能的结构..

符号:> NavigationLink

符号:~子视图

HostingViewController ~ CustomListView > FormTypeView > BuildFormView(此处已构建 ObservedObject)~ ViewPagerView(PageView 的水平列表)~ FourItemCardView ~ TextFieldInputView。

替代结构大纲帮助解释

- HostingViewController ~ CustomListView

     - FormTypeView

         - BuildFormView ~ ViewPagerView ~ FourItemCardView ~ TextFieldInputView

当您在 ListView 中单击“添加”时,您可以从表单类型中进行选择,然后 BuildFormView 会创建一个多卡可滑动视图分页器。这是在 ObservableObject 中构建的。

在一个完美的世界里,我所有的数据都会绑定到..

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

我可以在 ObservableObject 的 buildFormData1() 中调用它。

 let headline: String = pageCells[0].valueOne
 let location: String = pageCells[0].valueTwo
 let isPrivate: String = pageCells[0].valueFour

我在 swiftui 中管理了视图绑定,并在按下按钮时进行回调,但绑定视图或回调 2-3 级似乎不起作用。

我已经尝试过 EnvironmentalObject 哪种中断。我不能在 SceneDelegate 中使用它,因为我在情节提要中有我的 HostingViewController。我可以在将 CustomListView 连接到 HostingViewController 的位置定义它,但是会崩溃(不记得原因)。即使这确实有效,要获得特定的数据也很困难。由于我的视图寻呼机是动态变化的,我无法单独定义 ObservedObject 中的每个变量。

有没有人找到一个提取深度嵌套数据的示例?我也无法避免嵌套,因为只要您有太多视图,SwiftUI 就会中断(一个误导性错误)。另外让我知道要发布什么代码,因为我可以发布大量代码,这可能会使这个问题过于复杂。

【问题讨论】:

  • 您的问题中的“>”是否意味着导航或直接子视图,或混合?我只是试图理解层次结构。
  • 啊,是的,我知道这有多令人困惑。我现在就解决这个问题。现在应该用图例更新

标签: swiftui


【解决方案1】:

这是基于视图偏好的可能方法。该演示复制了最后四个视图的简单层次结构,并展示了如何将在最后一个视图中输入的文本传输到层次结构中的最顶层视图。

// 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
    }
}

【讨论】:

  • 这太好了,我的第一个实现没有用,但我想我只是在某个地方漏掉了一些东西。明天我会跳回去,但这应该足以让我解决问题。当我到达那里时,我会将其标记为正确,谢谢!
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2021-08-11
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多