Может ли опубликованная переменная в наблюдаемом объекте использоваться непосредственно в выборе средства выбора как переменная привязки?

Я новичок в xcode 11 и SwiftUI. Я работаю над представлением настроек для своего приложения. Создал ObservableObject с опубликованным var dataType Int. В представлении настроек у меня есть окно выбора, в котором я передаю settingsStore.dataType. Это дает мне ошибку ниже.

Невозможно преобразовать значение типа Int в ожидаемый тип аргумента
Binding<SelectionValue>'

Я знаю, что могу обойти это, установив @State var dataType в представлении и передав $dataTpye для средства выбора, а затем присвоив значение объекту настроек. Просто интересно, есть ли более простой способ сделать это.

    import SwiftUI
    import Combine

    struct SettingsView: View {

        @ObservedObject var settingsStore: SettingsStore

        var body: some View {
            VStack {
                Text("Settings").font(.title)

                Text("Number of weeks in calendar view")
                HStack (spacing: 28) {
                    Button (action: {
                        self.settingsStore.numberOfWeeks -= 1
                    }) {
                        Image(systemName: "minus.circle")
                            .resizable()
                            .frame(width:60, height:60)
                    }

                    Text("\(settingsStore.numberOfWeeks)")
                        .font(.system(size: 38.0))

                    Button (action: {
                        self.settingsStore.numberOfWeeks += 1
                    }) {
                        Image(systemName: "plus.circle")
                            .resizable()
                            .frame(width:60, height:60)
                    }
                }

                Text("Default data type")
                Picker(selection: settingsStore.dataType, label: Text("Dafault Data Type")) {
                    Text("Blood Ketone Value (mmol/L)").tag(0)
                    Text("Ketostix").tag(1)
                }.pickerStyle(SegmentedPickerStyle())
            }
        }
    }

    class SettingsStore: ObservableObject {

        @Published var numberOfWeeks: Int {
            didSet {
                    UserDefaults.standard.set(numberOfWeeks, forKey: "numberOfWeeks")
                }
            }

        @Published var dataType: Int {
            didSet {
                    UserDefaults.standard.set(dataType, forKey: "dataType")
                }
            }

        init() {
            self.numberOfWeeks = UserDefaults.standard.integer(forKey: "numberOfWeeks")
            self.dataType = UserDefaults.standard.integer(forKey: "dataType")
        }
    }


    struct SettingsView_Previews: PreviewProvider {
        static var previews: some View {
            return SettingsView(settingsStore: SettingsStore())
        }
    }

1 ответ

Решение

То же обозначение, то есть $, для свойств ObservedObject,

Picker(selection: $settingsStore.dataType, label: Text("Dafault Data Type")) {
    Text("Blood Ketone Value (mmol/L)").tag(0)
    Text("Ketostix").tag(1)
}.pickerStyle(SegmentedPickerStyle())
Другие вопросы по тегам