Получение строк NSOutlineView для редактирования - PullRequest
4 голосов
/ 24 августа 2009

Кто-нибудь здесь знает, как сделать ячейки в NSOutlineView редактируемыми? Я использую код sampe от Apple, и я не могу заставить его работать вообще.

Я пытаюсь настроить его так, чтобы при быстром последовательном нажатии на ячейку в NSOutlineView ячейка становилась редактируемой, чтобы пользователь мог обновить текст внутри ячейки. (Так же, как это работает в xcode, mail и т. Д.).

Я включаю большую часть кода этого контроллера в тщетную надежду, что кто-то может заметить, что я делаю неправильно, это очень расстраивает. Я знаю, что shouldEditTableColumn вызывается при возврате сообщения NSLog при двойном щелчке.

@implementation DisplayHierarchyController
- (void)awakeFromNib {
    // cache the reused icon images
    folderImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] retain];
    [folderImage setSize:NSMakeSize(16,16)];
    objectImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericPreferencesIcon)] retain];
    [objectImage setSize:NSMakeSize(16,16)];
    diagramImage = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericEditionFileIcon)] retain];
    [diagramImage setSize:NSMakeSize(16,16)];
    //
    // Tell the outline view to use a special type of cell
    //NSTableColumn *tableColumn = [[outline tableColumns] objectAtIndex: 0];
    //ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease];
    //[imageTextCell setEditable:YES];
    //[tableColumn setDataCell:imageTextCell];
    //
    [[[outline tableColumns] objectAtIndex: 0] setEditable: YES];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    NSLog(@"edit %@", tableColumn);
    return YES;
}
- (NSCell *)outlineView:(NSOutlineView *)outlineView dataCellForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    ImageTextCell *imageTextCell = [[[ImageTextCell alloc] init] autorelease];
    [imageTextCell setEditable:YES];
    return imageTextCell;
}
// Returns the object that will be displayed in the tree
- (id)outlineView: (NSOutlineView *)outlineView child: (int)index ofItem: (id)item {
    if(item == nil)
        return [[document children] objectAtIndex: index];
    if([item isKindOfClass: [Item class]])
        return [[item children] objectAtIndex: index];
    return document;
}
- (BOOL)outlineView: (NSOutlineView *)outlineView isItemExpandable: (id)item {
if([item isKindOfClass: [Item class]])
    return [[item children] count]>0;
return NO;
}
- (int)outlineView: (NSOutlineView *)outlineView numberOfChildrenOfItem: (id)item {
    if(item == nil)
        return document.children.count;
    if([item isKindOfClass: [Item class]])
        return [[item children] count];
    return 0;
}
- (id)outlineView: (NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    if([item isKindOfClass: [Item class]])
        return [item name];
    return @"n/a";
}
- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    NSLog(@"setObjectValue called");
}
- (void)outlineView:(NSOutlineView *)olv willDisplayCell:(NSCell*)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    [cell setEditable: YES];
    [cell setAllowsEditingTextAttributes: YES];
    [(ImageTextCell*)cell setImage: objectImage];
}
- (BOOL)control:(NSControl *)control textShouldBeginEditing:(NSText *)fieldEditor {
    return YES;
}
- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor {
    if ([[fieldEditor string] length] == 0) {
        // don't allow empty node names
        return NO;
    } else {
        return YES;
    }
}
@end

Ответы [ 4 ]

11 голосов
/ 13 августа 2013

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

Допустим, вы скопировали весь код Apple, и у вас запущен и запущен NSOutlineView, а также некоторые его возможности по-прежнему редактировать, перейдите в XIB и установите следующую настройку NSTextField ячейки, которую вы хочу быть редактируемым В моем случае настройка поведения была установлена ​​на none по умолчанию. Может быть, это та же проблема для вас

enter image description here

Приветствие.

6 голосов
/ 24 августа 2009

Является ли сам столбец доступным для редактирования? Обычно вы делаете это в IB.

Кроме того, вы реализовали метод outlineView:setObjectValue: в своем источнике данных?

2 голосов
/ 26 августа 2009

Я только что обнаружил, что могу "подделать это", изменив shouldEditTableColumn. Это действительно не идеально, но это работает. После стольких часов попыток заставить его работать, по крайней мере, это что-то:

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldEditTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    NSLog(@"edit %@", tableColumn);
    [outline editColumn:0 row:[outline selectedRow] withEvent:[NSApp currentEvent] select:YES];
    return YES;
}
1 голос
/ 11 ноября 2009

Я нашел способ обойти это. Установите ячейку данных для столбца в IB (программно в awakeFromNib тоже должно работать). Я на самом деле использую 2 разных пользовательских класса клеток. Мое решение:

NSCell *cell = [tableColumn dataCellForRow: [outlineView rowForItem: item]];

if ([item isKindOfClass: [NSString class]])
    return [[[ShadowTextCell alloc] initTextCell: [cell stringValue]] autorelease];
return cell;
...