【问题标题】:How to cause an update of model to trigger a update in another controller in swift如何导致模型更新以快速触发另一个控制器中的更新
【发布时间】:2016-12-31 20:27:53
【问题描述】:

View Controller A 可以访问模型并且可以改变模型。视图控制器 B 显示模型。我想要在 View Controller A 更新模型时,在 View Controller B 中触发一个方法,以便更新视图。在 Swift 中是否有标准的方法来做到这一点?

【问题讨论】:

    标签: ios swift model-view-controller


    【解决方案1】:

    在这个变量的 didset 中你可以发布一个通知,而另一个控制器可以注册这个通知。 (我们可以根据需要做的更整齐。)

    【讨论】:

    • 我的模型可以表示为类或结构。如果它是一个结构,则两个控制器不能共享相同的引用。我应该通过通知传递结构吗?或者如果它是一个类,那么你怎么能添加一个 didSet 呢? (因为似乎没有类似的方式为类标记“变异”)或者 didSet 应该在模型内部创建,而不是在拥有它的视图控制器中创建?
    • 如果您想通知任何子属性更改,那么您将不得不使用结构,但它不会像您所说的那样共享,但在课堂上您必须在每个属性中写入 didSet。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是您可以做到这一点的一种方法。

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

      当视图控制器 A 操作模型时,在 userInfo 字典中发布一个通知,其中包含对模型的引用作为协议的实例。视图控制器 B,订阅通知并在触发时从 userInfo 中提取引用,然后通过通用协议获取所需的数据。

      【讨论】:

        【解决方案4】:

        在 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
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-23
          相关资源
          最近更新 更多