2012-04-10 10 views
11

con fines de aprendizaje me gustaría convertir un NSOutlineView basada en células a uno,¿Cómo hago un simple NSOutlineView basado en vistas?

básicamente me gustaría que el siguiente basadas en vistas:

  • en lugar de una célula normal, me gustaría una 'imagen y texto ver celda de la tabla'
  • la imagen puede ser la acción NSApplicationIcon y el texto sólo puede ser 'hola mundo' :)
  • me gustaría hacer esto sin usar fijaciones y NSTreeController

Aquí está el 'mundos más simples NSOutlineView' ejemplo http://www.cocoasteam.com/Cocoa_Steam/Worlds_Simplest_Demo.html

Me pregunto si alguien puede modificarlo para que sea vista y basado en trabajar como he dicho anteriormente :) :)

He intentado mirar ejemplos de manzana, y buscando en otros lugares en Internet, pero todavía no puede conseguir que funcione - así que muchas gracias de antemano :)

Respuesta

11

OK, entonces quiere un NSOutlineView con ImageAndTextCell celdas, ¿verdad?

Hagamos uno de los ejemplos más típicos de este tipo: un simple explorador de archivos.

Lo que vamos a necesitar:

  • un NSOutlineView (poner un esquema para su AppDelegate, como fileOutlineView)
  • crear 3 columnas en el esquema con los siguientes identificadores (configurarlas en la interfaz constructor): NameColumn, SizeColumn, ModifiedColumn

Ahora, en cuanto al resto, lo haré todo mediante programación, por lo para tener una buena idea de lo que está pasando ...

Cómo configurarlo (p. ej. en - (void)awakeFromNib):

// set the Data Source and Delegate 
[fileOutlineView setDataSource:(id<NSOutlineViewDataSource>)self]; 
[fileOutlineView setDelegate:(id<NSOutlineViewDelegate>)self]; 

// set the first column's cells as `ImageAndTextCell`s 
ImageAndTextCell* iatc = [[ImageAndTextCell alloc] init]; 
[iatc setEditable:NO]; 
[[[fileOutlineView tableColumns] objectAtIndex:0] setDataCell:iatc]; 

Conectando los puntos:

/******************************************************* 
* 
* OUTLINE-VIEW DATASOURCE 
* 
*******************************************************/ 

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item 
{   
    if ([item isFolder]) 
     return YES; 
    else 
     return NO; 
} 

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item 
{  
    if (item==nil) 
    { 
     // Root 
     return [[filePath folderContentsWithPathAndBackIgnoringHidden] count]; 
    } 
    else 
    {   
     if ([item isFolder]) 
     { 
      return [[item folderContentsWithPathAndBackIgnoringHidden] count]; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
} 

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item 
{ 
    if (item == nil) 
    { 
     // Root 
     return [[filePath folderContentsWithPathAndBackIgnoringHidden] objectAtIndex:index]; 
    } 

    if ([item isFolder]) 
    { 
     return [[item folderContentsWithPathAndBackIgnoringHidden] objectAtIndex:index]; 
    } 

    // File 
    return nil; 
} 

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)theColumn byItem:(id)item 
{   
    if ([[theColumn identifier] isEqualToString:@"NameColumn"]) 
    { 
     return [item lastPathComponent]; 
    } 
    else if ([[theColumn identifier] isEqualToString:@"SizeColumn"]) 
    { 
     if ([item isFolder]) return @"--"; 
     else return [NSString stringWithFormat:@"%d",[item getFileSize]]; 
    } 
    else if ([[theColumn identifier] isEqualToString:@"ModifiedColumn"]) 
    { 
     if ([item isFolder]) return @""; 
     else return [NSString stringWithFormat:@"%@",[item getDateModified]]; 
    } 

    // Never reaches here 
    return nil; 
} 

/******************************************************* 
* 
* OUTLINE-VIEW DELEGATE 
* 
*******************************************************/ 

- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item 
{ 
    return YES; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item 
{ 
    return NO; 
} 

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
    [cell setDrawsBackground:NO]; 

    if ([item isFileHidden]) [cell setTextColor:[NSColor grayColor]]; 
    else [cell setTextColor:[NSColor whiteColor]]; 

    if ([[tableColumn identifier] isEqualToString:@"NameColumn"]) 
    { 
     if ([item isFolder]) 
      [cell setImage:[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)] size:15.0]; 
     else 
      [cell setImage:[[NSWorkspace sharedWorkspace] iconForFile:item] size:15.0]; 

     if ([item isFileHidden]) 
     { 
      [cell setFileHidden:YES]; 
     } 
     else 
     { 
      [cell setFileHidden:NO]; 
     } 

    } 

} 

Consejo:ImageAndTextCell clase se puede encontrar here. También se dará cuenta algunos otros métodos que estoy usando, lo que obviamente no son soportados por Cacao (por ejemplo isFileHidden, isFolder o folderContentsWithPathAndBackIgnoringHidden), pero no es tan difícil de aplicar por sí mismo ...)

+18

No veo cómo es esto correcto. ImageAndTextCell es del tipo NSCell, NO NSView. La pregunta era sobre una vista basada en NSOutlineView. Su ejemplo es simplemente crear una subclase de NSCell personalizada que hemos podido hacer durante años. Para NSTableView hay muchos ejemplos de cómo usar NSView en lugar de NSCell. Se parece mucho a iOS. No he encontrado ningún ejemplo de NSOutlineView con tristeza. –

+1

@ Las tablas basadas en Adam-view usan NSTableCellViews como sus vistas. Desde allí, puede agregarles cualquier contenido. Lo que el Dr.Kameleon ha dicho es exactamente correcto. El conjunto de tablas basadas en el punto de vista es que puede agregar cualquier objeto de vista que desee (ya sea una celda, botón, imagen bien ... lo que sea) – Patrick

+1

No se trata de crear una vista de esquema basada en vista. – JeremyP

0

Comprobar TableViewPlayground, también vista basada NSTableView básico a avanzado de la WWDC 2011.

+2

Gracias, ya he comprobado ese ejemplo y me parece demasiado hinchado y confuso. Necesito un ejemplo muy simple para asimilar, creo (también soy un poco nuevo en cocoa: P) – horseyguy

8

he creado un pequeño proyecto de muestra que hace justamente eso.

  • mostrar una lista de artículos
  • Editar los elementos en forma de detalle maestro
  • retirar y añadir artículos
  • El uso de fijaciones

Salida besi/mac-quickies en github. La mayoría del material se realiza ya sea en IB o se pueden encontrar en la AppDelegate

screenshot

+2

Es un ejemplo fácil de seguir. Gracias. – JeremyP

2

Para devolver la vista a la columna OutlineView En lugar de utilizar el método de origen de datos que devuelven objectValue:

  • (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) theColumn byItem: artículo (id)

utiliza el método DATASOURCE que devuelven VISTA !!!!!!!!:

  • (NSView *) outlineView: (NSOutlineView *) outlineView viewForTableColumn: (NSTableColumn *) Artículo TableColumn: artículo (ID)

todo lo demás es el mismo (solicitud mínima son los tres primeros métodos de fuente de datos, no necesita los métodos de delegado) pero no se puede usar willdisplaycell se llama solo para celda, haga todo lo posible para la vista en el método viefortablecolumn como este:

if ([[tableColumn identifier] isEqualToString:@"YourColumnIdentifier"]){ 
    NSTableCellView *cell = [outlineView makeViewWithIdentifier:@"YourViewsIdentifier" owner:self]; 
    [cell.textField setStringValue:[(YourItem *)item name]]; 
    [cell.imageView setImage:[(YourItem *)item image]]; 
    return cell; 
} 

return nil; 

y no para establecer los identificadores y establecer que OutlineView esté basado en la vista (en IB ...).

+0

OK, eso funciona pero el resultado es muy feo. OutlineView aparece detrás de la vista: por lo tanto, esto no es lo mismo que NSTableView basado en vistas. – Christophe

Cuestiones relacionadas