NSOutlineView: иногда строка не редактируется (только звуковые сигналы) - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть NSOutlineView на основе представления, настроенный с источником данных и делегатом. Он состоит из двух столбцов пользовательского класса NSTableCellView.

Записи в режиме структуры можно редактировать, выбрав строку и нажав клавишу Return. Все настроено в соответствии с документацией и работает нормально большую часть времени.

Однако иногда, когда я нажимаю Return, когда выбрана строка, текстовое поле ячейки не входит в режим редактирования. Он просто подает звуковой сигнал.

Я все еще могу войти в режим редактирования, "долго щелкая" в текстовом поле. По какой-то причине ключевое событие Return иногда обрабатывается по-разному.

Я захватил две трассировки стека:

# 1 Работает, как и ожидалось:

working

Вы можете видеть, что с keyDown() событие в конечном итоге делает текстовое поле ячейки первым респондентом.

# 2 Beep

beep

Я установил точку останова на NSBeep, и вы можете видеть, что на этот раз ключ даже идет другим путем.

Я подозреваю, что, возможно, внутреннее состояние представления структуры или базовое NSTableView перепутано ...

Как я могу устранить эту проблему здесь? Какие шаги предпринимает набросок, чтобы определить, можно ли редактировать строку после нажатия клавиши Return?

Обновление

Я сделал еще одну отладку (спасибо @ Виллек за подсказку о точке останова). Мне удалось довести это до следующего:

  • Нажата клавиша возврата
  • NSOutlineView.keydown
  • ...
  • NSOutlineView.selectedRow
    • контурный вид проверяет, какая строка выбрана
  • NSOutlineView.rowView(atRow row: Int, makeIfNecessary: Bool)
    • контурный вид извлекает выбранный вид строки
  • NSTableRowView.nextValidKeyView
    • текущий вид строки запрашивается для следующего действительного вида ключа
  • NSTableRowView.nextKeyView
    • Теперь это иногда возвращает nil и приложение просто пищит. Большую часть времени он возвращает NSTableCellView для этой строки, содержащей NSTextField, который затем становится первым респондентом и, следовательно, редактируется.

Теперь возникает вопрос, почему следующий ключевой вид nil иногда? Я щелкаю на строке вида структуры, чтобы она имела фокус / выделена ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...