如何在ObservableObject类上更新绑定计算属性?



我有这样一个类:

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)
}
}
}

最新更新