У меня есть NSOutlineView
на основе представления, настроенный с источником данных и делегатом. Он состоит из двух столбцов пользовательского класса NSTableCellView
.
Записи в режиме структуры можно редактировать, выбрав строку и нажав клавишу Return
. Все настроено в соответствии с документацией и работает нормально большую часть времени.
Однако иногда, когда я нажимаю Return
, когда выбрана строка, текстовое поле ячейки не входит в режим редактирования. Он просто подает звуковой сигнал.
Я все еще могу войти в режим редактирования, "долго щелкая" в текстовом поле. По какой-то причине ключевое событие Return
иногда обрабатывается по-разному.
Я захватил две трассировки стека:
# 1 Работает, как и ожидалось:
Вы можете видеть, что с keyDown()
событие в конечном итоге делает текстовое поле ячейки первым респондентом.
# 2 Beep
Я установил точку останова на NSBeep
, и вы можете видеть, что на этот раз ключ даже идет другим путем.
Я подозреваю, что, возможно, внутреннее состояние представления структуры или базовое NSTableView
перепутано ...
Как я могу устранить эту проблему здесь? Какие шаги предпринимает набросок, чтобы определить, можно ли редактировать строку после нажатия клавиши Return?
Обновление
Я сделал еще одну отладку (спасибо @ Виллек за подсказку о точке останова). Мне удалось довести это до следующего:
- Нажата клавиша возврата
NSOutlineView.keydown
- ...
NSOutlineView.selectedRow
- контурный вид проверяет, какая строка выбрана
NSOutlineView.rowView(atRow row: Int, makeIfNecessary: Bool)
- контурный вид извлекает выбранный вид строки
NSTableRowView.nextValidKeyView
- текущий вид строки запрашивается для следующего действительного вида ключа
NSTableRowView.nextKeyView
- Теперь это иногда возвращает
nil
и приложение просто пищит. Большую часть времени он возвращает NSTableCellView
для этой строки, содержащей NSTextField
, который затем становится первым респондентом и, следовательно, редактируется.
Теперь возникает вопрос, почему следующий ключевой вид nil
иногда? Я щелкаю на строке вида структуры, чтобы она имела фокус / выделена ...