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

Ios 如何使模型更新触发swift中另一个控制器的更新,ios,swift,model-view-controller,Ios,Swift,Model View Controller,视图控制器A可以访问模型,并且可以修改模型。视图控制器B显示模型。我想要在视图控制器A更新模型时,在视图控制器B中触发一个方法,以便更新视图。在Swift中是否有标准的方法来执行此操作?在此变量的didset中,您可以发布通知,其他控制器可以注册此通知。(我们可以根据需要更灵活地执行此操作。)在此变量的didset中,您可以发布通知,其他控制器可以注册此通知。(我们可以根据需要更灵活地进行操作。)如果将模型对象设置为Objective-C对象(@objc),则可以使用KVO(键值观察)来观察对它

视图控制器A可以访问模型,并且可以修改模型。视图控制器B显示模型。我想要在视图控制器A更新模型时,在视图控制器B中触发一个方法,以便更新视图。在Swift中是否有标准的方法来执行此操作?

在此变量的didset中,您可以发布通知,其他控制器可以注册此通知。(我们可以根据需要更灵活地执行此操作。)

在此变量的didset中,您可以发布通知,其他控制器可以注册此通知。(我们可以根据需要更灵活地进行操作。)

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

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

这里有一种方法可以做到这一点

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


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

以下是一种方法

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


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

两个视图控制器之间通信的另一种方式是协议。定义协议,例如:

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
    }

}

两个视图控制器之间通信的另一种方式是协议。定义协议,例如:

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
    }

}

我的模型可以表示为类或结构。如果是结构,则两个控制器不能共享同一引用。我应该将结构传递给通知吗?或者如果它是一个类,那么如何添加didSet?(因为似乎没有类似的方法为类标记“mutating”),或者应该在模型内部创建didSet,而不是在拥有它的视图控制器中?如果您想通知任何子属性更改,则必须使用结构,但它不会像您所说的那样共享,但在类中,您必须在每个属性集中写入。我的模型可以表示为类或结构。如果是结构,则两个控制器不能共享同一引用。我应该将结构传递给通知吗?或者如果它是一个类,那么如何添加didSet?(因为似乎没有类似的方法为类标记“mutating”),或者应该在模型内部创建didSet,而不是在拥有它的视图控制器中?如果您想通知任何子属性更改,那么您必须使用structs,但它不会像您所说的那样共享,但是在类中,您必须在每个属性集中编写。