У меня есть пользовательское представление, в котором есть несколько компонентов, которые могут получить фокус, аналогично NSDatePicker
в стиле textFieldAndStepper
.Если он получает фокус, фокусируется первый компонент.Затем вы можете переключаться между компонентами.Если вы нажмете вкладку, когда последний компонент имеет фокус, следующий вид в окне получит фокус.Когда вы используете backtab (shift + tab), он идет в другом направлении.Как бы я это сделал?
В настоящее время я перемещаю фокус по компонентам в событии keyDown
и перезаписываю becomeFirstResponder
и resignFirstResponder
, чтобы включить или отключить фокус, когда пользователь выходит за пределыпоследний компонент или backtabs после первого компонента.
Однако в becomeFirstResponder
я не могу сказать, как вид получил фокус.Это могла быть вкладка, backtab или щелчок мыши.
Как получить эту информацию в 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)
}
}