Делегировать события для NSTextField в основанном на представлении NSOutlineView? - PullRequest
4 голосов
/ 30 декабря 2011

У меня есть безупречное функционирующее представление на основе NSOutlineView с надлежащим источником данных настройки в моем проекте.Теперь я хочу разрешить пользователю изменять определенные записи.Поэтому я сделал NSTextField в IB редактируемым.Для NSOutlineView на основе ячеек вы можете использовать метод делегата outlineView:setObjectValue:forTableColumn:byItem:, однако он не доступен для NSOutlineView на основе представления, как указано в заголовочном файле для протокола NSOutlineViewData:

/ * View Based OutlineView: этот метод не применим.* /

(void) outlineView: (NSOutlineView *) outlineView setObjectValue: (id) объект forTableColumn: (NSTableColumn *) tableColumn byItem: (id) item;

Итак, я искалдля другого метода делегата и нашел outlineView:shouldEditTableColumn:item:.Однако этот метод делегата не запускается.Возможно, потому что я не редактирую ячейку.

Так что мой вопрос: есть ли другой способ заметить, когда изменилась строка, кроме наличия делегата для каждого NSTextField?

Ответы [ 2 ]

9 голосов
/ 27 мая 2014

Вы правы, что ваше текстовое поле должно быть редактируемым в Интерфейсном Разработчике.

Затем настройте контроллер на соответствие NSTextFieldDelegate.Затем установите делегат для текстового поля в outlineView: viewForTableColumn: item:, например, так:

tableCellView.textField.delegate = self

Вот упрощенный пример, в котором вы реализовали метод возврата представления ячейки таблицы для элементадля вашего наброска.

-(NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    NSTableCellView *tableCellView = [outlineView makeViewWithIdentifier:@"myTableCellView" owner:self];

    MyItem *myItem = (MyItem *)item; // MyItem is just a pretend custom model object 
    tableCellView.delegate = self;
    tableCellView.textField.stringValue = [myItem title];

    tableCellView.textField.delegate = self;

    return result;
}

Затем контроллер должен получить уведомление controlTextDidEndEditing:

- (void)controlTextDidEndEditing:(NSNotification *)obj
{
    NSTextField *textField = [obj object];
    NSString *newTitle = [textField stringValue];

    NSUInteger row = [self.sidebarOutlineView rowForView:textField];

    MyItem *myItem = [self.sidebarOutlineView itemAtRow:row];
    myItem.name = newTitle;  
}
4 голосов
/ 30 декабря 2011

Что ж, похоже, Apple хочет, чтобы мы использовали методы делегата для каждого NSTextField, как указано здесь :

Этот метод предназначен для использования с табличными представлениями на основе ячеек, его нельзя использовать с табличными представлениями на основе представлений. Вместо этого цель / действие используется для каждого элемента в ячейке представления.

Так что в настоящее время нет другого способа сделать это.

...