0

我正在使用各种视图模型对象创建一个 SwiftUI 应用程序来支持视图。在某些视图上,用户可以在不保存更改的情况下离开,例如“取消”,如果底层视图模型有任何更改,我想提示确认。一些视图模型具有许多可以设置/更改的属性,因此我试图避免必须更改每个 @Published 属性以具有didChange捕获更改的方法,因为这将是很多丑陋的管道,感觉没有必要。由于对象的订阅者可以检测到更改,我想知道是否有一种方法可以让我自己挂钩,以便我可以对对象的已发布更改做出反应,然后设置hasChanges标志。

非常感谢任何帮助/建议。

class MySimpleViewModel: ObservableObject {
    @Published var firstName: String
    @Published var lastName: String
    @Published var age: Int
    // I want to be able to set this automatically by hooking into the pub/sub pipeline.
    var hasChanges: Bool = false
    
    init (firstName: String, lastName: String, age: Int) {
        self.firstName = firstName
        self.lastName = lastName
        self.age = age
    }
}
4

1 回答 1

2

一个简单的解决方案是,通过将这部分代码更改为:

@Published private(set) var hasChanges: Bool = false

init(firstName: String, lastName: String, age: Int) {
  self.firstName = firstName
  self.lastName = lastName
  self.age = age

  objectWillChange
    .first()
    .map { true }
    .assign(to: &$hasChanges)
}

但是,因为任何东西都可以订阅objectWillChange,您可能需要重新考虑将这些信息存储在对象本身中。

于 2020-10-03T12:35:09.057 回答