Ios 如何使用property observer更新其他控制器中具有相同属性的对象模型?
我阅读了苹果的文档和一些教程,从中我了解到我们可以设置观察者,如果修改对象,它将被称为if object。但我心里没有什么疑问 以下是一个摘要,其中模型将收到有关属性更改的通知: 假设有3个视图控制器,它们显示Ios 如何使用property observer更新其他控制器中具有相同属性的对象模型?,ios,swift,uiviewcontroller,key-value-observing,nsobject,Ios,Swift,Uiviewcontroller,Key Value Observing,Nsobject,我阅读了苹果的文档和一些教程,从中我了解到我们可以设置观察者,如果修改对象,它将被称为if object。但我心里没有什么疑问 以下是一个摘要,其中模型将收到有关属性更改的通知: 假设有3个视图控制器,它们显示Foo模型的列表Foo模型具有名为id和title的属性。我的问题是,是否可以在其他控制器中得到通知,例如,修改了Foo模型,该模型具有id10。只有当同一个模型实例在3个控制器之间共享时,或者尽管实例不同,我们也可以实现它,这是可能的吗 我正在寻找一个具体的解决方案,其中一个用户喜欢一
Foo
模型的列表Foo
模型具有名为id
和title
的属性。我的问题是,是否可以在其他控制器中得到通知,例如,修改了Foo
模型,该模型具有id
10。只有当同一个模型实例在3个控制器之间共享时,或者尽管实例不同,我们也可以实现它,这是可能的吗
我正在寻找一个具体的解决方案,其中一个用户喜欢一个feed(类似于Facebook)在一个屏幕上,如果另一个控制器中有一个具有相同id的feed,那么应该通知该控制器该feed已被修改,刷新其UI。我附上了清晰的想法图像
我不希望使用委托模式或通知模式,因为它可能会造成混乱,相反,观察者模式将是更合适的解决方案。下面是一个如何实现这一点的示例 馈送模式:
class Feed: NSObject {
var id: String
@objc dynamic var isLiked = false
init(id: String) {
self.id = id
}
}
要观察的任何属性,请将其标记为@objc dynamic
,即提要中的islike
class ListVC: UIViewController {
let feed = Feed(id: "1")
var observer: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func openDetailVC(_ sender: UIButton) {
if let detailVC = self.storyboard?.instantiateViewController(withIdentifier: "DetailVC") as? DetailVC {
self.observer = detailVC.feed.observe(\.isLiked, options: [.new], changeHandler: { (feed, change) in
if let newValue = change.newValue {
print(newValue)
//Reload the UI here...
}
})
self.navigationController?.pushViewController(detailVC, animated: true)
}
}
}
接下来是一个ListVC
,它有一个feed
属性
在viewDidLoad()
中的feed
中添加一个observer
。指定要在feed
中观察的属性,即isLiked
。每次isLiked
属性发生更改时,都会调用观察者中的闭包
现在,DetailVC
将被删除
class DetailVC: UIViewController {
let feed = Feed(id: "1")
@IBAction func likeButtonPressed(_ sender: UIButton) {
self.feed.isLiked = !self.feed.isLiked
}
}
在上面的代码中,每当按下likeButton
时,我都会在feed
中更改isLiked
属性的值。非常感谢。我正在实现同样的功能,我很快就会回来。在这里,Feed
对象在列表和详细信息屏幕之间共享。在我的情况下,不同的视图控制器将具有不同的提要
对象实例,例如,它可能出现在搜索屏幕的搜索结果中,也可能出现在收藏夹和其他控制器中,这些控制器将具有相同的对象类型,但内存地址完全不同。在这种情况下,您需要在detailVC中将observer添加到提要属性中。更新了密码,但没听清你说的。。你能详细解释一下吗?