SwiftUI | Доступ к выбору PickerView из другого представления SwiftUI - PullRequest
0 голосов
/ 09 мая 2020

Я устал строить многокомпонентный сборщик на основе user3441734 решения для динамического c сборщика. Этот сборщик находится в собственном файле .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 могут соответствовать протоколам

1 Ответ

0 голосов
/ 09 мая 2020

Дополнительное выделение не требуется, поскольку выделение уже сохранено в модели, поэтому

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 (объявив ту же наблюдаемую модель, что и выше) . И есть некоторое представление root, содержащее оба, так что это может быть как

struct RootView: View {
    let model = Model() // << create it here

    var body: some View {
      VStack {
        DynamicPicker(model: self.model)
        ManufacturerView(model: self.model)
      }
    }
}

, поэтому, когда выбор обновляется в DynamicPicker, тогда ManufacturerView будет обновляться автоматически с соответствующим выбором, потому что использовать те же данные источник.

...