Направление, что NSView получил фокус (вкладка или backtab)? - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть пользовательское представление, в котором есть несколько компонентов, которые могут получить фокус, аналогично 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)
  }
}

1 Ответ

0 голосов
/ 22 ноября 2018

Похоже, у вас сейчас есть проблема.Но я подумал, можно ли получить тот же эффект, переопределив NSView nextKeyView и previousKeyView?Это должно обеспечить необходимую вам направленность, но также может лучше взаимодействовать с системой в целом (т.е. с доступностью), чем просто с помощью нажатия клавиш.

...