我有一个自定义视图,其中包含多个可以接收焦点的组件,类似于NSDatePicker
风格的textFieldAndStepper
。如果获得焦点,则第一个组件被聚焦。然后,您可以浏览各个组件。如果在最后一个组件具有焦点的情况下单击选项卡,则窗口中的下一个视图将获得焦点。使用backtab(Shift + Tab)时,它会朝另一个方向移动。我该怎么办?
我目前在keyDown
事件中将焦点移到各个组件上,并且当用户切换到最后一个组件之外时,我将覆盖becomeFirstResponder
和resignFirstResponder
以打开或关闭焦点或第一个组件之外的backtab。
但是在becomeFirstResponder
中,我无法确定视图是如何获得焦点的。可能是标签页,背面标签或鼠标单击。
如何在becomeFirstResponder
中获得此信息,或者有另一种方法来解决此问题。
请注意,出于各种原因,我不想介绍子视图。
这是我到目前为止的代码:
private var selectedComponent: Int?
override public var acceptsFirstResponder: Bool {
get { return true }
}
override public func becomeFirstResponder() -> Bool {
selectedComponent = 0
needsDisplay = true
return true
}
override public func resignFirstResponder() -> Bool {
selectedComponent = nil
needsDisplay = true
return true
}
override public func keyDown(with event: NSEvent) {
guard let selectedComponent = selectedComponent else {
self.nextResponder?.keyDown(with: event)
return
}
guard let specialKey = event.specialKey else {
self.nextResponder?.keyDown(with: event)
return
}
if specialKey == NSEvent.SpecialKey.tab && selectedComponent < componentFormats.count - 1 {
self.selectedComponent = selectedComponent + 1
needsDisplay = true
} else if specialKey == NSEvent.SpecialKey.backTab && selectedComponent > 0 {
self.selectedComponent = selectedComponent - 1
needsDisplay = true
} else {
self.nextResponder?.keyDown(with: event)
}
}
答案 0 :(得分:0)
听起来您确实已经解决了问题。但是,我在想,是否可以通过覆盖NSView的nextKeyView
和previousKeyView
来获得相同的效果?这样不仅可以提供所需的方向性,而且还可以与整个系统(即辅助功能)进行交互,而不仅仅是通过按下按键进行交互。