Первый ответчик на поведение мыши вниз NSControl и NSView - PullRequest
0 голосов
/ 09 марта 2019

У меня есть пользовательский элемент управления.Если он наследуется от NSView, он автоматически становится первым респондентом, когда я нажимаю на него.Если он наследуется от NSControl, это не так.Эта разница в поведении сохраняется, даже если я переопределяю mouseDown(with:) и не вызываю super.

Код:

class MyControl: NSView {
  override var canBecomeKeyView: Bool      { return true }
  override var acceptsFirstResponder: Bool { return true }
  override func drawFocusRingMask()        { bounds.fill() }
  override var focusRingMaskBounds: NSRect { return bounds }

  override func draw(_ dirtyRect: NSRect) {
    NSColor.white.set()
    bounds.fill()
  }
}

Как видите, я переопределяю acceptsFirstResponder среди других методови свойства, связанные с ключевым видом и респондентом.Я также проверил свойство refusesFirstResponder.Для него установлено значение false.

  1. В чем причина такой разницы в поведении?
  2. Существует ли метод или свойство, которое я могу переопределить, чтобы повлиять на него?

1 Ответ

2 голосов
/ 09 марта 2019

Свойство для переопределения: needsPanelToBecomeKey.

Логическое значение, указывающее, нуждается ли представление в том, чтобы его панель стала окном клавиш, прежде чем он сможет обрабатывать ввод с клавиатуры и навигацию.

Значением по умолчанию для этого свойства является false. Подклассы могут переопределить это свойство и использовать их реализацию, чтобы определить, требует ли представление, чтобы его панель стала ключевым окном, чтобы он мог обрабатывать ввод с клавиатуры и навигацию. Такой подкласс должен также переопределить acceptptsFirstResponder, чтобы возвратить true.

Это свойство также используется при навигации по клавиатуре. Он определяет, должен ли щелчок мыши фокусировать вид, то есть сделать его первым респондентом). Некоторые виды (например, текстовые поля) хотят получить фокус клавиатуры при нажатии на них. Другие виды (например, кнопки) получают фокус только при нажатии на них. Вы не хотели бы, чтобы фокус сместился с текстового поля, в котором выполняется редактирование, просто потому, что вы установили флажок.

NSView возвращает true, NSControl возвращает false.

...