我有一个自定义视图,它有多个可以接收焦点的组件,类似于textFieldAndStepper
样式中的NSDatePicker
。如果它得到了焦点,第一个组件就被聚焦了。然后,您可以通过选项卡浏览组件。如果您在最后一个组件具有焦点时点击选项卡,则窗口中的下一个视图将获得焦点。当你使用后标签(shift+tab(时,它会朝另一个方向移动。我该怎么做?
我当前沿着keyDown
事件中的组件移动焦点,并且当用户选项卡超出最后一个组件或后选项卡超出第一个组件时,我覆盖becomeFirstResponder
和resignFirstResponder
以打开或关闭焦点。
然而,在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)
}
}
听起来你的问题现在已经解决了。但是,我在想,是否可以通过覆盖NSView的nextKeyView
和previousKeyView
来获得同样的效果?这应该提供你需要的方向性,但也可能比仅仅通过按键键更好地与系统交互(即可访问性(。