Swiftui 如何对ObserveObject类进行绑定计算属性更新?
我有这门课:Swiftui 如何对ObserveObject类进行绑定计算属性更新?,swiftui,Swiftui,我有这门课: class MyModel:ObservableObject { var selectedObjectIndex:Int { set {} get { let selectedResult = objects.filter({ $0 == selectedObject }) if selectedResult == 0 { return 0 } return objects.firstIndex(of: selected
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
}
选择器显示正确,但如果我在其上设置了一个新值,则模型
selectedObjectIndex
不会更新。您可以尝试以下操作,每当绑定更新时,您的selectedObjectIndex
可以在完成一些相关工作后触发对象更改
通知。我已经创建了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()
}
}
您为selectedObjectIndex设置的方法不起作用。如何解决这个问题?这取决于您希望在
selectedObjectIndex.set
上持久化(即存储)什么。从你的代码来看,意图并不明确-你能详细说明一下吗?为什么不干脆@StateObject var model=MyModel()
?@pawello2222我们当然可以这样做,但我有一个旧的代码片段,我刚刚修改过。
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
struct WaveViewApp: App {
@StateObject var model:MyModel
init() {
let model = MyModel()
_model = StateObject(wrappedValue: model)
}
var body: some Scene {
WindowGroup {
CreditCardFront(myModel: model)
}
}
}