Определить активный NSSplitViewItem - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть SplitView с (несколькими) SplitViewItems.Echt SplitViewItem имеет ViewController с несколькими представлениями в нем.

Мне нужно определить, какой из SplitViewItems находится в фокусе пользователя.

Например: если пользователь щелкает по любому элементу управления / представлению (или перемещается к нему любым другим способом),фон SplitViewItem, который содержит этот элемент представления, должен измениться.Поскольку я не знаю, какие / сколько видов будут включены в ViewController в SplitViewItem, я бы предпочел определить, какой SplitViewItem является «активным» в SplitViewController.

Я искалрешение в течение всего дня.Я не смог найти ни одного вида уведомлений и не нашел способа решить эту проблему с управлением цепочкой респондента.

Кто-нибудь может указать мне правильное направление?(Быстрый) пример кода будет высоко оценен.

Спасибо!

1 Ответ

0 голосов
/ 19 ноября 2018

Мне потребовалось немало исследований, но я нашел рабочее решение.Не самый элегантный, но работающий.

Я нашел лучший подход - добавить монитор событий в 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), что позволяет легкореагировать на любые изменения, происходящие внутри «активной панели».

Любые более элегантные / простые решения приветствуются!

...