NSDatePicker
我有一个自定义视图,它有多个可以接收焦点的组件,类似于textFieldAndStepper
样式。如果它获得焦点,则第一个组件被聚焦。然后,您可以通过选项卡浏览组件。如果您在最后一个组件获得焦点时点击选项卡,则窗口中的下一个视图将获得焦点。当您使用 backtab(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)
}
}