NSTextFieldCell Делегат? - PullRequest
       11

NSTextFieldCell Делегат?

10 голосов
/ 28 мая 2009

У меня есть ячейка текстового поля в табличном представлении, из которой мне нужно знать, когда она заканчивает редактирование. Я думал, что установлю свой класс Controller в качестве делегата ячейки текстового поля, а затем использую метод делегата NSTextField textDidEndEditing:, но понял, что ячейка текстового поля не имеет методов делегата? Почему это так, и что я могу сделать (кроме подклассов), чтобы получить информацию о завершении редактирования?

Спасибо

Ответы [ 2 ]

15 голосов
/ 28 мая 2009

NSTextFieldCell наследуется от NSCell (ну, технически от NSActionCell, который наследуется от NSCell). Класс NSCell используется для (из документов ):

Класс 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 (а не саму ячейку) в том, что под крышкой, когда вы редактируете ячейку таблицы, ячейка, с которой вы имеете дело не редактируется напрямую; это окно (или пользовательский) редактор полей. Когда редактирование заканчивается, редактор полей затем передает новое значение для этой ячейки в табличное представление. Однако в табличном представлении будет опубликовано уведомление о том, что ячейка закончила редактирование.

0 голосов
/ 08 февраля 2010

Реализуйте метод tableView:setObjectValue:forTableColumn:row: в протоколе NSTableViewDataSource. Поместите его рядом с методом tableView:objectValueForTableColumn:row:, который вы уже реализовали.

- (void)tableView:(NSTableView *)aTableView
   setObjectValue:(id)anObject
   forTableColumn:(NSTableColumn *)aTableColumn
              row:(NSInteger)rowIndex
{
    [mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...