如何同步多个控件?

时间:2018-11-28 12:15:46

标签: swift design-patterns

我正在快速寻找模式以同步多个控件的状态。假设我在视图中有NSSegmentedControl,有NSMenuItem个带有复选标记,并且在触摸栏中有NSSegmentedControl。他们每个人都在向模型发送变更。但是如何与其他两个同步?我可以使用委托,但是随着可同步项的数量,复杂性似乎会增加。是否有解决此问题的通用模式?我会想到诸如更改订阅之类的东西,因此所有3个控件都可以订阅它并在发生更改时接收通知,然后使用其自己的数据转换传递给该控件。想知道是否有某种机制。

1 个答案:

答案 0 :(得分:0)

有一个机制,就是通知模型。我想像您希望视图控制器侦听更改并更新其控件-而不是让每个控件侦听更改并自行更新(这也是可能的)。基本方法是将通知观察者添加到视图控制器(或您想成为观察者的任何对象)...

NotificationCenter.default.addObserver(self, selector: #selector(nHandler(_:)), name: NSNotification.Name(rawValue: "someControlDidChange"), object: segmentedControl)

...以及负责对该通知采取行动的处理程序...

@objc func nHandler(_ notification: Notification) {
    guard let control = notification.object as? UISegmentedControl else {
        return
    }
    // determine which control posted the notification
    // read the control's new value
    // update the other controls
}

然后作为控件更新其值,并发布通知...

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "someControlDidChange"), object: self)

如果此通知是从控件内部(即它的子类)或控件本身的实例(即object)发布的,则此处的self可以是someSegmentedControl

通过通知观察者和通知发布者,您可以包括一个可选的object,如您在我的示例中所见。您应该在这些通知中传递一些数据,以使观察者可以确定发布通知的对象以及该对象已更新为的值。然后,在通知观察器的处理程序中,解包该对象以获取该数据。

我尚未确定发布通知的成本;我真的不知道它有多贵。如果委托方法太凌乱,并且您已撇除财产观察员,则通知模型可能是可行的方法。