Может ли опубликованная переменная в наблюдаемом объекте использоваться непосредственно в выборе средства выбора как переменная привязки?
Я новичок в 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())