可以将观察者放在selectedIndex
的{{1}}方法上。我认为这种方法有一些缺点:
重新排列NSArrayController
后会发生什么?我承认这不是一个非常重要的问题
如果我们要求观察者记住arrangedObjects
的旧值,则它不起作用。众所周知,但我找不到链接。
为什么NSArrayController没有委托? 还有另一种方法可以实现我想要做的事情:在选择改变时启动一些方法吗?
答案 0 :(得分:4)
观察selection
的{{1}}密钥(它继承自NSArrayController
)。
它将返回NSObjectController
(当选择了多个对象时),NSMultipleValuesMarker
(当没有选择任何内容时),或者代表所选对象的代理,然后可以通过代理查询原始对象值NSNoSelectionMarker
密钥。
如果重新排列对象实际上没有改变选择,它将不会改变。
您还可以观察self
;在这种情况下,您不需要处理标记。
答案 1 :(得分:0)
在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
}
}