SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择

Posted

技术标签:

【中文标题】SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择【英文标题】:SwiftUI | Access PickerView selection from another SwiftUI View 【发布时间】: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';只有结构/枚举/类类型可以符合协议

【问题讨论】:

【参考方案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 将自动更新为相应的选择,因为使用相同的数据源。

【讨论】:

以上是关于SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 从另一个视图更改观察到的对象

如何在swiftUI的父视图中从另一个视图访问变量?

如何从另一个视图swiftui中传递字段文本值

SwiftUI 从另一个视图中捕获 Picker 值

SwiftUI:从另一个初始化程序调用它时,如何让我的闭包返回“内容”而不是“某些视图”?

如何在 SwiftUI 视图中访问 UIView 子类的属性?