【发布时间】:2016-12-31 20:27:53
【问题描述】:
View Controller A 可以访问模型并且可以改变模型。视图控制器 B 显示模型。我想要在 View Controller A 更新模型时,在 View Controller B 中触发一个方法,以便更新视图。在 Swift 中是否有标准的方法来做到这一点?
【问题讨论】:
标签: ios swift model-view-controller
View Controller A 可以访问模型并且可以改变模型。视图控制器 B 显示模型。我想要在 View Controller A 更新模型时,在 View Controller B 中触发一个方法,以便更新视图。在 Swift 中是否有标准的方法来做到这一点?
【问题讨论】:
标签: ios swift model-view-controller
在这个变量的 didset 中你可以发布一个通知,而另一个控制器可以注册这个通知。 (我们可以根据需要做的更整齐。)
【讨论】:
如果您将模型对象设为 Objective-C 对象 (@objc),那么您可以使用 KVO(键值观察)来观察它的变化。如果你这样做了,那么任何观察模型属性的对象都会在该属性发生变化时得到通知。
【讨论】:
这是您可以做到这一点的一种方法。
让你使用的任何模型,类或结构,实现一个可由视图控制器 B 使用的协议。视图控制器 B 不应该关心模型是什么,只要它符合它需要提取的协议它需要的数据。
当视图控制器 A 操作模型时,在 userInfo 字典中发布一个通知,其中包含对模型的引用作为协议的实例。视图控制器 B,订阅通知并在触发时从 userInfo 中提取引用,然后通过通用协议获取所需的数据。
【讨论】:
在 2 个视图控制器之间进行通信的另一种方式是协议。定义一个协议,如:
protocol ViewControllerAModelProtocol: class {
func viewControllerAModelDidUpdate()
}
在 ViewControllerA 中,定义一个委托类型:
weak var updatedProtocol: viewControllerAModelDidUpdate?
当模型更新并调用时:
updatedProtocol?.viewControllerAModelDidUpdate()
在 ViewControllerB 中,实现协议:
class ViewControllerB: UIViewController, ViewControllerAModelProtocol {
func viewControllerAModelDidUpdate() {
// reloadData()
}
}
如果 ViewControllerB 由 ViewControllerA 呈现或显示,则将 A 的 updatedProtocol 设置为 B:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let b = segue.destination as? ViewControllerAModelProtocol {
self.updatedProtocol = b
}
}
【讨论】: