我有这样一个类:
class MyModel:ObservableObject {
var selectedObjectIndex:Int {
set {}
get {
let selectedResult = objects.filter({ $0 == selectedObject })
if selectedResult == 0 { return 0 }
return objects.firstIndex(of: selectedResult.first!)!
}
}
}
这个selectedObjectIndex
通常是一个@Published var selectedObjectIndex:Int
,但因为它是一个计算属性,我不能在这里使用@Published
。
所以我不得不把这个添加到模型
func getselectedObjectIndexBinding() -> Binding<Int> {
let binding = Binding<Int>(
get: { () -> Int in
return self.selectedObjectIndex
}) { (newValue) in
self.selectedObjectIndex = newValue
}
return binding
}
在视图中我有一个选择器,使用如下
Picker(selection: myModel.getselectedObjectIndexBinding(),
label: Text("select")) {
选择器显示正确,但如果我在其上设置一个新值,则模型selectedObjectIndex
未更新。
您可以尝试如下操作,每当绑定更新时,您的selectedObjectIndex
可以在做一些相关工作后触发ObjectWillChange
通知。我已经创建了selectedObjectIndex
作为propertyObserver
。
struct CreditCardFront: View {
@ObservedObject var myModel:MyModel
var body: some View {
Picker(selection: myModel.getselectedObjectIndexBinding(),
label: Text("select")) {
ForEach(1..<10) { value in
Text("(value)")
}
}
Text("(myModel.selectedObjectIndex ?? 0)")
}
}
class MyModel:ObservableObject {
var selectedObjectIndex:Int?{
didSet{
// Your work here
update() // call notification on specific change
}
}
func getselectedObjectIndexBinding() -> Binding<Int> {
let binding = Binding<Int>(
get: { () -> Int in
return self.selectedObjectIndex ?? 0
}) { (newValue) in
self.selectedObjectIndex = newValue
}
return binding
}
func update(){
self.objectWillChange.send()
}
}
@main -:
@main
struct WaveViewApp: App {
@StateObject var model:MyModel
init() {
let model = MyModel()
_model = StateObject(wrappedValue: model)
}
var body: some Scene {
WindowGroup {
CreditCardFront(myModel: model)
}
}
}