NSTextFieldCell
наследует от NSCell
(ну, технически от NSActionCell
, который наследует от NSCell
). NSCell
класса используются для (от docs):
NSCell класс обеспечивает механизм для отображения текста или изображений в объекте NSView без накладных расходов полного NSView подкласса.
Следует отметить, что класс клеток используются для «отображение текста или изображений» и не имеет дело с взаимодействием с пользователем. Аналогичным образом, с классом NSTextField
:
Класс NSTextField использует класс NSTextFieldCell для реализации его пользовательского интерфейса.
В NSTextField
деле с фактическим вводом данными пользователя, в то время как с помощью ячейки текстового поля, чтобы просто реализовать свой пользовательский интерфейс, а так же методы делегата предоставить уведомление, когда редактирование текста закончилось осуществляется через NSTextField
класса и не через класс NSTextFieldCell
.
Если вы хотите получить уведомление о том, когда редактирование заканчивается в NSTableView
, то вам необходимо зарегистрироваться в качестве наблюдателя от NSTextDidEndEditingNotification
(вы можете прочитать ссылку NSNotificationCenter класса, если вы не знакомы с уведомлениями). Чтобы сделать это, поместите следующее в свой класс контроллера; функция awakeFromNib
является хорошим местом, чтобы включить его, чтобы убедиться, что она вызывается при запуске вашего приложения:
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(textDidEndEditing:)
name:NSTextDidEndEditingNotification
object:tableView];
Где tableView
является указателем на ваш NSTableView
объекта. Тогда просто реализовать метод следующим образом:
- (void)textDidEndEditing:(NSNotification *)aNotification
{
// Do what you want here
}
Не забудьте удалить себя в качестве наблюдателя на открепления:
- (void)dealloc
{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
}
Причина, по которой вы установите объект, который вы наблюдаете, чтобы быть NSTableView
экземпляр (а не сама ячейка) заключается в том, что под капотом, когда вы редактируете ячейку в таблице, ячейка, с которой вы имеете дело, не редактируется напрямую; это редактор полей окна (или пользовательский). Когда редактирование заканчивается, редактор полей затем передает новое значение для этой ячейки в виде таблицы. Однако в представлении таблицы будет отправлено уведомление о том, что ячейка закончила редактирование.
Обнаружено, что метод TextDidEndEditing: работает, но не метод TextDidBeginEditing:. Есть ли у вас какие-либо идеи? – Yun