2011-11-11 3 views
16

Qualcuno ha trovato un esempio o una guida chiara e concisa su come implementare un elenco di fonti utilizzando il NSOutlineView basato sulla vista introdotto in Lion? Ho esaminato il progetto di esempio di Apple, ma senza alcun senso di direzione o spiegazione, trovo difficile comprendere il concetto di come funzionano esattamente.Esempio di come implementare un elenco di sorgenti basato su viste (NSOutlineView) usando Cocoa Bindings?

So come utilizzare l'eccellente PXSourceList come fallback, ma vorrei davvero iniziare a utilizzare gli elenchi di origine basati sulla vista, se possibile.

risposta

29

Hai taggato questo con il tag cacao-binding, quindi presumo tu intenda "con binding". Ho fatto un rapido esempio. Inizia da un nuovo modello di applicazione Cocoa non basato su documenti in Xcode. Chiamalo come vuoi Per prima cosa ho aggiunto del codice per creare dei dati falsi su cui legare. Ecco ciò che il mio colpo di testa AppDelegate assomiglia:

#import <Cocoa/Cocoa.h> 

@interface SOAppDelegate : NSObject <NSApplicationDelegate> 

@property (assign) IBOutlet NSWindow *window; 

@property (retain) id dataModel; 

@end 

Ed ecco quello che la mia realizzazione AppDelegate assomiglia:

#import "SOAppDelegate.h" 

@implementation SOAppDelegate 

@synthesize window = _window; 
@synthesize dataModel = _dataModel; 

- (void)dealloc 
{ 
    [_dataModel release]; 
    [super dealloc]; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    // Insert code here to initialize your application 

    // Make some fake data for our source list. 
    NSMutableDictionary* item1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.1", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item2_2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.2", @"itemName", [NSMutableArray array], @"children", nil]; 
    NSMutableDictionary* item3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 3", @"itemName", [NSMutableArray array], @"children", nil]; 

    [[item2_2 objectForKey: @"children"] addObject: item2_2_1]; 
    [[item2_2 objectForKey: @"children"] addObject: item2_2_2]; 

    [[item2 objectForKey: @"children"] addObject: item2_1]; 
    [[item2 objectForKey: @"children"] addObject: item2_2]; 

    NSMutableArray* dataModel = [NSMutableArray array]; 

    [dataModel addObject: item1]; 
    [dataModel addObject: item2]; 
    [dataModel addObject: item3]; 

    self.dataModel = dataModel; 
} 

@end 

Non c'è particolare importanza per la struttura di dati falsi che ho creato, ho solo voluto mostrare qualcosa con un paio di sottolivelli, ecc. L'unica cosa che conta è che i percorsi chiave specificati nei collegamenti di Interface Builder coincidano con le chiavi nei dati (dati falsi in questo caso)

Quindi selezionare il MainMenu.xib fil e. Nel l'editor IB, effettuare le seguenti operazioni:

  1. utilizzare l'oggetto Library (Ctrl-Cmd-Opt-3) per aggiungere un NSTreeController al vostro .xib.
  2. Selezionare il NSTreeController, e utilizzando Impostazioni Attributi (Cmd-Opt-4) impostare chiave Percorsi> I bambini-children (per questo esempio, per i dati, questo dovrebbe essere quello restituisce l'array di oggetti figlio.)
  3. con la NSTreeController ancora selezionato, utilizzare l'ispettore Associazioni (Cmd-Opt-7) di impegnare la Content Array al AppDelegate, con un modello Percorso chiave di dataModel
  4. Avanti utilizzare la libreria di oggetti (Ctrl-Comando + Opt-3) per aggiungere un NSOutlineView al tuo .xib.
  5. Disporre in modo soddisfacente all'interno della finestra (in genere l'intera altezza della finestra, a filo contro il lato sinistro)
  6. Selezionare NSOutlineView (notare che la prima volta che si fa clic su di esso, è probabile che sia stata selezionata la NSScrollView che lo contiene Fai clic su di esso una seconda volta e avrai eseguito il drill-down su NSOutlineView. Nota che questo è MUCH più facile se si allarga l'area a sinistra dell'editor IB in cui si trovano tutti gli oggetti - - questo ti permette di vedere gli oggetti come un albero, e navigare e selezionarli in questo modo.)
  7. utilizzando Impostazioni attributi (Cmd-Opt-4) impostare il NSOutlineView:
    • Modalità contenuto: View Based
    • Colonne: 1
    • Highlight: Source List
  8. Utilizzando l'ispettore binding (Cmd-Opt-7) associare "Co ntent "a" Tree Controller ", Controller Key: arrangedObjects (Questo è il punto in cui il comportamento di NSTableView/NSOutlineViews basato su View inizia a divergere da quelli basati su NSCell)
  9. Nell'Elenco Oggetti (menzionato in # 6), espandi il visualizzare la gerarchia di NSOutlineView e selezionare Static Text - Table View Cell.
  10. utilizzando Impostazioni Associazioni (Cmd-Opt-7) si legano Valore-Table Cell View, Modello Percorso chiave: objectValue.itemName (ho usato itemName nei dati falsi, si vorrebbe utilizzare qualsiasi chiave corrisponde al nome del tuo dati)

Salva. Correre. Si dovrebbe vedere un elenco di origine, e una volta espanso i nodi con i bambini, si potrebbe vedere qualcosa di simile:

enter image description here

Se siete nel programma Apple Developer, si dovrebbe essere in grado di accedere il WWDC 2011 Videos. Ce n'è uno specificamente dedicato a lavorare con ViewView NSTableView (e NSOutlineView) e include una copertura piuttosto approfondita dei binding.

Spero che questo aiuti!

+1

FYI del 2011 il video WWDC è seduta 120 intitolato visualizzazione basata NSTableView. – jemeshsu

+1

Per chi lo usa: considera anche: http://stackoverflow.com/questions/7095703/binding-view-based-nsoutlineview-to-core-data – bijan

+0

In questo modo è possibile eseguire anche in Leopard e Snow Leopard? – arufian