我正在快速寻找模式以同步多个控件的状态。假设我在视图中有NSSegmentedControl
,有NSMenuItem
个带有复选标记,并且在触摸栏中有NSSegmentedControl
。他们每个人都在向模型发送变更。但是如何与其他两个同步?我可以使用委托,但是随着可同步项的数量,复杂性似乎会增加。是否有解决此问题的通用模式?我会想到诸如更改订阅之类的东西,因此所有3个控件都可以订阅它并在发生更改时接收通知,然后使用其自己的数据转换传递给该控件。想知道是否有某种机制。
答案 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
,如您在我的示例中所见。您应该在这些通知中传递一些数据,以使观察者可以确定发布通知的对象以及该对象已更新为的值。然后,在通知观察器的处理程序中,解包该对象以获取该数据。
我尚未确定发布通知的成本;我真的不知道它有多贵。如果委托方法太凌乱,并且您已撇除财产观察员,则通知模型可能是可行的方法。