Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使用property observer更新其他控制器中具有相同属性的对象模型?_Ios_Swift_Uiviewcontroller_Key Value Observing_Nsobject - Fatal编程技术网

Ios 如何使用property observer更新其他控制器中具有相同属性的对象模型?

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个控制器之间共享时,或者尽管实例不同,我们也可以实现它,这是可能的吗 我正在寻找一个具体的解决方案,其中一个用户喜欢一

我阅读了苹果的文档和一些教程,从中我了解到我们可以设置观察者,如果修改对象,它将被称为if object。但我心里没有什么疑问

以下是一个摘要,其中模型将收到有关属性更改的通知:

假设有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添加到提要属性中。更新了密码,但没听清你说的。。你能详细解释一下吗?