SwiftUI | Доступ к выбору PickerView из другого представления SwiftUI

Я устал создавать многокомпонентное средство выбора на основе решения 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])"
        }
    }
}

???? Тип '()' не может соответствовать 'View'; только типы struct / enum / class могут соответствовать протоколам


person Daniel    schedule 09.05.2020    source источник


Ответы (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 будет автоматически обновляться с соответствующим выбором, потому что используется тот же источник данных.

person Asperi    schedule 09.05.2020