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