检测活动的NSSplitViewItem

时间:2018-11-16 17:39:51

标签: swift nssplitview nssplitviewcontroller

我有一个带有(几个)SplitViewItems的SplitView。 Echt SplitViewItem具有一个包含多个视图的ViewController。

我需要检测哪个SplitViewItems具有用户焦点。

例如:如果用户单击任何控件/视图(或以任何其他方式导航至该控件/视图),则包含该视图项的SplitViewItem的背景应更改。由于我不知道SplitViewItem的ViewController中将包含哪个/多少个视图,我更愿意检测哪个SplitViewItem是SplitViewController中的“活动”对象。

我整天都在寻找解决方案。我找不到任何类型的通知,也找不到解决这种管理响应者链的方法。

有人能指出我正确的方向吗?一个(快速的)代码示例将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

我花了很多时间进行研究,但找到了可行的解决方案。不是最优雅,但可以正常工作。

我发现最好的方法是将事件监视器添加到SplitViewController。

在viewDidLoad()中添加以下代码:

    NSEvent.addLocalMonitorForEvents(matching: [.keyDown, .leftMouseDown, .flagsChanged]) { [unowned self] (theEvent) -> NSEvent? in
        let eventLocation = theEvent.locationInWindow
        let numberOfSplitViews = self.splitViewItems.count
        var activeIndex: Int?

        for index in 0..<numberOfSplitViews {
            let view = self.splitViewItems[index].viewController.view
            let locationInView = view.convert(eventLocation, from: nil)
            if ((locationInView.x > 0) && (locationInView.x < view.bounds.maxX) && (locationInView.y > 0) && (locationInView.y < view.bounds.maxY)) {
                activeIndex = index
                break
            }
        }

        switch theEvent.type {
        case .keyDown:
            print("key down in pane \(activeIndex)")
            self.keyDown(with: theEvent)
        case .leftMouseDown, .rightMouseDown:
            print("mouse down in pane \(activeIndex)")
            self.mouseDown(with: theEvent)
        case .flagsChanged:
            print("flags changed in pane \(activeIndex)")
            self.flagsChanged(with: theEvent)
        default:
            print("captured some unhandled event in pane \(activeIndex)")
        }
        return theEvent
    }

(您可能需要根据自己的喜好调整相关事件。此外,您可能需要使用NSEvent.removeMonitor(_ :)删除监视器。)

此外(超出此问题的范围),您可能还需要考虑使变量activeIndex成为可观察的类变量(我使用RxSwift做到了这一点),使您可以轻松地对“活动”窗格中发生的任何更改做出反应'。

欢迎使用任何更优雅/简单的解决方案!