2012-04-10 18 views
11

a fini di apprendimento vorrei convertire un NSOutlineView cell-based a una visione-based uno,Come posso creare un semplice NSOutlineView basato sulla vista?

fondamentalmente vorrei il seguente:

  • invece di una cellula normale, mi piacerebbe un 'immagine e la cella della tabella di testo vista'
  • l'immagine può essere lo stock NSApplicationIcon e il testo può essere solo 'ciao mondo' :)
  • mi piacerebbe fare questo senza usare attacchi e NSTreeController

Ecco l' 'mondi più semplici NSOutlineView' esempio http://www.cocoasteam.com/Cocoa_Steam/Worlds_Simplest_Demo.html

Mi chiedo se qualcuno potrebbe modificarlo per renderlo in base alla vista e lavorare come ho detto sopra :) :)

ho provato guardando esempi di mele, e la ricerca altrove su Internet, ma non riesco ancora a farlo funzionare - quindi grazie mille in anticipo :)

risposta

11

OK, quindi vuoi un NSOutlineView con celle ImageAndTextCell, giusto?

Facciamo uno degli esempi più tipici di questo tipo: un semplice file explorer.

Ciò di cui abbiamo bisogno:

  • un NSOutlineView (mettere un contorno al vostro AppDelegate, come fileOutlineView)
  • creare 3 colonne della Outline con i seguenti identificatori (li istituito nel Interface Builder): NameColumn, SizeColumn, ModifiedColumn

Ora, come per il resto, farò tutto a livello di codice, in modo da di avere una buona idea di cosa sta succedendo ...

Come configurarlo (ad es. in - (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]; 

Connecting the Dots:

/******************************************************* 
* 
* 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]; 
     } 

    } 

} 

Suggerimento:ImageAndTextCell classe può essere trovato here. Noterete anche un paio di altri metodi che sto usando, che sono, ovviamente, non supportati da cacao (ad es isFileHidden, isFolder o folderContentsWithPathAndBackIgnoringHidden), ma non è così difficile da attuare da soli ...)

+18

Non vedo come sia corretto. ImageAndTextCell è di tipo NSCell, NOT NSView. La domanda riguardava una vista NSOutlineView basata. Il tuo esempio riguarda la creazione di una sottoclasse NSCell personalizzata che siamo stati in grado di fare per anni. Per NSTableView ci sono molti esempi su come usare NSView invece di NSCell. Somiglia molto a iOS. Non ho trovato nessun esempio di NSOutlineView tristemente. –

+1

@ Le tabelle basate su Adam view utilizzano NSTableCellViews come viste. Da lì puoi aggiungere qualsiasi contenuto a loro. Quello che ha detto Dr. Kameleon è esattamente giusto. L'intero punto di vista delle tabelle basate è che è possibile aggiungere qualsiasi oggetto vista desiderato (sia esso una cella, pulsante, immagine bene ... qualunque cosa) – Patrick

+1

Non si tratta di creare una vista struttura basata sulla vista. – JeremyP

0

Controllare TableViewPlayground, anche vista basata NSTableView base a quello avanzato da WWDC 2011.

+2

Grazie, ho già controllato quell'esempio e trovo che sia troppo gonfio e confuso. Ho bisogno di un esempio molto semplice per farlo sembrare (im anche un po 'nuovo per il cacao: P) – horseyguy

8

ho creato un piccolo progetto di esempio che fa proprio questo.

  • visualizzare un elenco di elementi
  • modificare gli elementi in modo master-detail
  • rimuovere e aggiungere elementi
  • L'utilizzo di attacchi

Partenza besi/mac-quickies su github. maggior parte delle cose si sia fatto in IB o può essere trovato nel AppDelegate

screenshot

+2

È un esempio facile da seguire. Grazie. – JeremyP

2

Per tornare al fine di colonna OutlineView Invece di utilizzare il metodo origine dati che restituiscono objectValue:

  • (id) outlineView: (NSOutlineView *) outlineView objectValueForTableColumn: (NSTableColumn *) theColumn byItem: (id) voce

utilizzare il metodo DATASOURCE CHE RITORNO VISTA !!!!!!!!:

  • (NSView *) outlineView: (NSOutlineView *) outlineView viewForTableColumn: (NSTableColumn *) voce TableColumn: (id) voce

tutto il resto è la lo stesso (req minimo è i primi tre metodi dell'origine dati, non è necessario i metodi delegati) ma, non è possibile utilizzare willdisplaycell è chiamato solo per cella, fare tutto per la visualizzazione nel metodo viefortablecolumn come questo:

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; 

e non per arrivare a impostare gli identificatori e impostare la Vista Struttura su Vista basata (in IB ...).

+0

OK, funziona ma il risultato è molto brutto. OutlineView appare dietro la vista: quindi, questo non è esattamente lo stesso di NSTableView basato su visualizzazione. – Christophe

Problemi correlati