После того, как я целый день ломал голову над этой проблемой, не найдя окончательного ответа в документации Apple, я решил поделиться найденным решением на тот случай, если кто-то еще столкнется с той же проблемой.
Согласнодокументация, как упоминалось в оригинальном постере, методы control:textShouldBeginEditing
и control:textShouldEndEditing
из NSControlTextEditingDelegate
должны вызываться напрямую для делегата:
Это сообщение отправленоуправление непосредственно его делегированному объекту.
Кроме того, Apple выпустила Технический Q & A с заголовком Обнаружение начала и конца сеансов редактирования ячейки в NSTableView , где она явнозаявил следующее:
A: Как определить начало и конец сеансов редактирования ячейки в NSTableView?
Чтобы определить, когда пользователь собирается начать и завершитьотредактируйте сеанс ячейки в NSTableView
, вам необходимо установить его в качестве делегата этой таблицы и реализовать следующие NSControl
методы делегата:
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor;
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor;
Таблица перенаправляет сообщение делегата, которое оно получает из текстового представления, на ваш объект делегата, используя метод control:textShouldEndEditing:
.Таким образом, ваш делегат может быть проинформирован о том, какой элемент управления редактора поля текстового представления действует от его имени.
Я обнаружил ничего в документации Apple, где указано что-то другое, и если кто-то делает,указатель документации действительно был бы оценен.
Фактически, это выглядит как true , если используется основанный на ячейке NSTableView
.Но как только вы изменяете таблицу на таблицу, основанную на представлении, метод делегата больше не вызывается для объекта делегата таблицы.
A Решение
ОднакоНекоторые эвристические тесты, которые я выполнил, показали, что эти методы делегата вызываются для делегата таблицы на основе представления, если (и насколько я знаю: и только если):
- Делегат таблицы установлен.
- Установлен делегат редактируемого элемента управления.
Если удалить какой-либо делегат, методы протокола NSControlTextEditingDelegate
не будут вызываться.
Что неожиданносогласно (только) документация устанавливает делегата редактируемого элемента управления.С другой стороны, установка объекта делегата для получения уведомлений делегата звучит довольно интуитивно для меня , и поэтому я попытался в первую очередь.Но есть подвох!Любопытно, однако, что недостаточно .Если делегат таблицы удален, методы NSControlTextEditingDelegate
не будут вызываться, даже если установлен делегат редактируемого элемента управления (что для меня странно).
Надеюсь, это поможет кому-то другому не потерятьвремя по этому вопросу.