人们可以把观察者放在selectedIndex
的NSArrayController
方法上。我认为这种方法有一些缺点:
arrangedObjects
被重新排列时会发生什么?我承认这不是一个非常重要的问题selectedIndex
的旧值,它就不起作用。众所周知,但我找不到链接。为什么NSArrayController没有委托?有没有其他方法可以实现我想要做的事情:在选择更改时启动一些方法?
观察selection
的NSArrayController
键(它继承自NSObjectController
)。
它将返回NSMultipleValuesMarker
(当选择了许多对象时),NSNoSelectionMarker
(当没有选择任何内容时),或者代表所选对象的代理,然后可以通过self
键查询原始对象值。
如果重新排列对象实际上没有改变选择,它将不会改变。
你也可以观察selectedObjects
;在这种情况下,您不需要处理标记。
在Swift 4中提供hamstergene的出色解决方案。
在viewDidLoad
,观察关键路径。
arrayController.addObserver(self, forKeyPath: "selectedObjects", options: .new, context: nil)
在视图控制器中,
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard let keyPath = keyPath else { return }
switch keyPath {
case "selectedObjects":
// arrayController.selectedObjects has changed
default:
break
}
}