【问题标题】:SwiftUI | Access PickerView selection from another SwiftUI ViewSwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择
【发布时间】:2020-05-09 15:14:45
【问题描述】:

我厌倦了为动态选择器构建基于user3441734 solution 的多组件选择器。这个选择器存在于它自己的 .swift 文件中。我不知道如何将选择保存在变量中以便再次从另一个视图访问它。

到目前为止,这是我的代码。我用 ???? 标记了我的错误解决方案以及下面的错误消息。

import SwiftUI
struct DynamicPicker: View {
    @ObservedObject var model = Model()

    // var to store the selection
    @State var selection: String = ""

    var body: some View {

        VStack {

            GeometryReader { geometry in

                HStack {

                    Picker(selection: self.$model.selectedManufacturer, label: Text("")){
                        ForEach(0 ..< self.model.manufacturerNames.count){ index in
                            Text(self.model.manufacturerNames[index])
                        }
                    }.labelsHidden()
                        .frame(maxWidth: geometry.size.width * CGFloat(0.3333))
                        .clipped()

                    Picker(selection: self.$model.selectedStock, label: Text("")){
                        ForEach(0 ..< self.model.stockNamesCount){ index in
                            Text(self.model.stockNames[index])
                        }
                    }
                    .id(self.model.id)
                    .labelsHidden()
                    .frame(maxWidth: geometry.size.width * CGFloat(0.6666))
                    .clipped()
                }
            }

            // Show selection
            Text("\(self.model.manufacturerNames[model.selectedManufacturer])-\(self.model.stockNames[model.selectedStock])")

            // Save selection to variable ????
            selection = "\(self.model.manufacturerNames[model.selectedManufacturer])-\(self.model.stockNames[model.selectedStock])"
        }
    }
}

???? 类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议

【问题讨论】:

    标签: ios swiftui xcode11.4 pickerview


    【解决方案1】:

    不需要额外的选择,因为选择已经存储在模型中,所以

    1) 删除这些行

    @State var selection: String = ""
    
    // Save selection to variable ?
    selection = "\(self.model.manufacturerNames[model.selectedManufacturer])-\(self.model.stockNames[model.selectedStock])"
    

    2) 不要创建内联模型,只需声明它可以通过构造函数注入

    struct DynamicPicker: View {
        @ObservedObject var model: Model  // << here !!
    

    3) 对DynamicPicker 使用与其他依赖视图相同的模型,假设它被称为ManufacturerView(声明了与上面相同的观察模型)。并且有一些根视图持有两者,所以它可能是

    struct RootView: View {
        let model = Model() // << create it here
    
        var body: some View {
          VStack {
            DynamicPicker(model: self.model)
            ManufacturerView(model: self.model)
          }
        }
    }
    

    所以当DynamicPicker 中的选择更新时,ManufacturerView 将自动更新为相应的选择,因为使用相同的数据源。

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2021-12-15
      • 1970-01-01
      • 2021-05-02
      • 2022-08-17
      • 2021-10-15
      相关资源
      最近更新 更多