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



我厌倦了为动态选择器构建基于user3441734解决方案的多组分选择器。这个拾取器生活在自己的.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])"
}
}
}

类型"()"不能符合"视图";只有结构/枚举/类类型才能符合协议

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

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将自动更新相应的选择,导致使用相同的数据源。

最新更新