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 选择的主要内容,如果未能解决你的问题,请参考以下文章