Pregunta

¿Alguien aquí sabe cómo hacer que las células en editible de NSOutlineView? Im utilizando el código Sampe de manzana y me parece que no puede conseguir que funcione en absoluto.

Estoy tratando de configurarlo de modo que cuando se hace clic dos veces en rápida sucesión en una celda de la NSOutlineView, la célula se convierte en editible por lo que el usuario puede actualizar el texto dentro de la celda. (De la misma manera, ya que trabaja en Xcode, y el correo, etc.).

Estoy incluyendo la mayor parte del resto del código de este controlador en la vana esperanza de que alguien puede detectar lo que estoy haciendo mal, esto es muy frustrante. Sé shouldEditTableColumn está siendo llamado, ya que es devolver el mensaje a NSLog doble clic.

@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
¿Fue útil?

Solución

Sé que esto es un post muy viejo, pero si alguien está experimentando el mismo problema, esto puede no ser un problema relacionado con el código. Para mi caso fue una cuestión relacionada que ver con un valor establecido en la propia XI ter.

lo que permite decir que haya copiado todo el código de Apple, y que tenga su NSOutlineView en funcionamiento, y de alguna forma su todavía no se puede editar, vaya a su XI ter y establecer la siguiente configuración de la NSTextField de la celda que quiero ser editable. En mi caso, el ajuste de la conducta se define en no de manera predeterminada. Tal vez sea el mismo problema para usted

introducir descripción de la imagen aquí

Saludos.

Otros consejos

Es la propia columna establecido como editables? Por lo general, podría hacer esto en IB.

Además, se han ejecutado el método outlineView:setObjectValue: en el origen de datos

?

He descubierto que acabo puede "fingir" alterando la shouldEditTableColumn. Su realmente no es ideal, pero funciona. Después de tantas horas tratando de conseguir que funcione, al menos esto es algo:

- (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;
}

He encontrado una forma de evitar esto. Establecer la celda de datos para la columna en IB (mediante programación en awakeFromNib debería funcionar también). En realidad yo uso 2 clases de células diferentes a medida. Mi solución:

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

if ([item isKindOfClass: [NSString class]])
    return [[[ShadowTextCell alloc] initTextCell: [cell stringValue]] autorelease];
return cell;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top