2009-05-27 5 views
10

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

Благодаря

ответ

14

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

+0

Обнаружено, что метод TextDidEndEditing: работает, но не метод TextDidBeginEditing:. Есть ли у вас какие-либо идеи? – Yun

0

Внесите метод 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]; 
}