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