检测活动的 NSSplitViewItem
Detect active NSSplitViewItem
我有一个带有(几个)SplitViewItem 的 SplitView。 Echt SplitViewItem 有一个 ViewController,里面有多个视图。
我需要检测用户关注的是哪个 SplitViewItem。
例如:如果用户单击任何 control/view(或以任何其他方式导航到它),包含该视图项的 SplitViewItem 的背景应该改变。因为我不知道 which/how SplitViewItem 中的 ViewController 中会包含许多视图,所以我更愿意检测哪个 SplitViewItem 是 SplitViewController 中的 'active' .
我整天都在寻找解决方案。我找不到任何类型的通知,也找不到解决此管理响应者链的方法。
谁能给我指出正确的方向?非常感谢 (swift) 代码示例。
谢谢!
我花了很多时间研究,但我找到了一个可行的解决方案。不是最优雅的,但工作。
我发现最好的方法是向 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 成为一个可观察的 class 变量(我用 RxSwift 做了这个),让你可以轻松地对任何变化做出反应发生在 'active pane' 内。
欢迎提供更多elegant/simple解决方案!
我有一个带有(几个)SplitViewItem 的 SplitView。 Echt SplitViewItem 有一个 ViewController,里面有多个视图。
我需要检测用户关注的是哪个 SplitViewItem。
例如:如果用户单击任何 control/view(或以任何其他方式导航到它),包含该视图项的 SplitViewItem 的背景应该改变。因为我不知道 which/how SplitViewItem 中的 ViewController 中会包含许多视图,所以我更愿意检测哪个 SplitViewItem 是 SplitViewController 中的 'active' .
我整天都在寻找解决方案。我找不到任何类型的通知,也找不到解决此管理响应者链的方法。
谁能给我指出正确的方向?非常感谢 (swift) 代码示例。
谢谢!
我花了很多时间研究,但我找到了一个可行的解决方案。不是最优雅的,但工作。
我发现最好的方法是向 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 成为一个可观察的 class 变量(我用 RxSwift 做了这个),让你可以轻松地对任何变化做出反应发生在 'active pane' 内。
欢迎提供更多elegant/simple解决方案!