NSArrayController更改其选择:捕获此事件的最佳方法是什么?

时间:2013-05-04 13:56:30

标签: macos cocoa model-view-controller nsarraycontroller

可以将观察者放在selectedIndex的{​​{1}}方法上。我认为这种方法有一些缺点:

  • 重新排列NSArrayController后会发生什么?我承认这不是一个非常重要的问题

  • 如果我们要求观察者记住arrangedObjects的旧值,则它不起作用。众所周知,但我找不到链接。

为什么NSArrayController没有委托? 还有另一种方法可以实现我想要做的事情:在选择改变时启动一些方法吗?

2 个答案:

答案 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
    }
}