如何更新模型以在swift中触发另一个控制器中的更新

时间:2016-12-31 20:27:53

标签: ios swift model-view-controller

View Controller A可以访问模型并可以改变模型。视图控制器B显示模型。我希望View Controller A更新模型,这是一种在View Controller B中触发的方法,以便更新视图。在Swift中有一种标准的方法吗?

4 个答案:

答案 0 :(得分:2)

在此变量的didset中,您可以发布通知,而另一个控制器可以注册此通知。 (我们可以根据要求更加整洁地进行。)

答案 1 :(得分:1)

如果将模型对象设为Objective-C对象(@objc),则可以使用KVO(键值观察)来观察对它的更改。如果这样做,那么当该属性发生变化时,任何正在观察模型属性的对象都会收到通知。

答案 2 :(得分:0)

这是你可以做到这一点的一种方式。

使用您使用的任何模型,类或结构,实现可由视图控制器B使用的协议。视图 - 控制器B不应该关心模型是什么,只是它符合它需要提取的协议它需要的数据。

当视图控制器A操纵模型时,在userInfo字典中发布带有模型引用的通知作为协议的实例。 view-controller B,订阅通知,触发时,从userInfo中提取引用,然后通过通用协议获取所需的数据。

答案 3 :(得分:0)

在2个视图控制器之间进行通信的另一种方法是协议。定义协议,例如:

protocol ViewControllerAModelProtocol: class {
    func viewControllerAModelDidUpdate()
}

在ViewControllerA中,定义委托类型:

weak var updatedProtocol: viewControllerAModelDidUpdate?

更新模型并致电时:

updatedProtocol?.viewControllerAModelDidUpdate()

在ViewControllerB中,实现协议:

class ViewControllerB: UIViewController, ViewControllerAModelProtocol {

    func viewControllerAModelDidUpdate() {
        // reloadData()
    }

}

如果ViewControllerA呈现或显示ViewControllerB,请将A&#39的updatedProtocol设置为B:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let b = segue.destination as? ViewControllerAModelProtocol {
        self.updatedProtocol = b
    }

}