2010-08-03 2 views
7

L'ho provato per due giorni e ho continuato a correre nei vicoli ciechi.Popolazione di NSTableview da un array mutabile

Ho partecipato alla programmazione Cocoa di Aaron Hillegass per MAC OS X e ho svolto tutti gli esercizi pertinenti relativi a NSTableview e array mutabili e ho tentato di modificarli in base alle mie esigenze.

Tuttavia, nessuno di essi sembra utilizzare un array con oggetti come origine dati, sembra utilizzare la vista tabella come origine dati.

Sto cercando di implementare "" di Jonas Jongejan "rielaborazione" del mio codice here, con un front-end Cocoa per visualizzare i risultati.

Qualsiasi suggerimento o suggerimento che conosco dovrebbe essere semplice, ma mi sono perso nella natura selvaggia qui.

posso popolare la tabella impostando la matrice

risposta

14

E 'abbastanza semplice, in realtà, una volta che si arriva a capire che (ovviamente!). Non è possibile utilizzare un NSArray direttamente come origine tabella. È necessario creare un oggetto personalizzato che implementa NSTableViewDataSource o implementare tale protocollo in alcune classi esistenti, in genere un controller. Se si utilizza Xcode per creare un'applicazione basata su documenti standard, la classe del controllore di documenti (che si chiamerà MyDocument) è una buona classe da utilizzare.

è necessario implementare almeno questi due metodi:

– numberOfRowsInTableView: 
– tableView:objectValueForTableColumn:row: 

Se si dispone di un array mutabile i cui valori si desidera utilizzare in una vista tabella con una colonna, qualcosa come il seguente dovrebbe fare come un inizio:

– numberOfRowsInTableView: (NSTableView*) aTableView 
{ 
    return [myMutableArray count]; 
} 

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    return [myMutableArray objectAtIndex: rowIndex]; 
} 

si è appena venuto in mente che si potrebbe aggiungere questi due metodi come una categoria a NSArray sostituzione myMutableArray con self e quindi è possibile utilizzare un array come una sorgente di dati.


In ogni caso, con una serie mutevole, è importante che ogni volta che si cambia, è necessario lasciare che la visualizzazione della tabella sapere che è stato modificato, quindi è necessario inviare la visualizzazione della tabella -reloadData.


Se la visualizzazione della tabella ha più di una colonna e si vuole popolarlo con le proprietà degli oggetti nella vostra matrice, c'è un trucco che si può fare per rendere più facile per te stesso.Diciamo che gli oggetti in vostro array sono istanze di una classe chiamata Persona con due metodi definiti:

-(NSString*) givenName; 
-(NSString*) familyName; 

e volete che il vostro vista tabella per avere una colonna per ciascuno di questi, è possibile impostare la proprietà identifier di ogni colonna al nome della proprietà nella persona che quella colonna visualizza e usare qualcosa come il seguente:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    Person* item = [myMutableArray objectAtIndex: rowIndex]; 
    return [item valueForKey: [tableColumn identifier]]; 
} 

se si sostituisce valueForKey: con valueForKeyPath: e la vostra classe persona ha anche i seguenti metodi:

è possibile aggiungere colonne di tabella con identificatori come: father.fullName o mother.familyName ei valori verranno popolati automaticamente.

1

Apple ha una guida completa per Table View di programmazione in modo Vi suggerisco di iniziare con la sezione Using a Table Data Source di quello che guida.

+1

questo collegamento non funziona !! per favore aggiornalo! – elin3t

1

Sull'iPhone (so che stai parlando di Mac, ma forse questo potrebbe essere d'aiuto) devi usare la delega per caricare un TableView. Richiede una cella e si utilizza la matrice per compilare i dati dove necessario. Non sono sicuro che funzioni per il Mac, ma varrebbe la pena esaminare.

Forse impostare DataSource per sé e utilizzare tali metodi delegato per accedere l'array in base alla riga e colonna #

+0

@ willcodejavaforfood's risposta è per l'iPhone, ma puoi seguire quel link per vedere cosa intendo – RSully

+0

Oops, ho gli iPhones sul mio cervello :) – willcodejavaforfood

3

È possibile seguire il percorso dell'origine dati e eseguire autonomamente tutte le operazioni di sollevamento pesante, oppure lasciare che le associazioni eseguano tutte le operazioni di sollevamento pesanti. Aggiungi un NSArrayController al file pennino che contiene la vista tabella. Assicurarsi che il proprietario del file del pennino sia impostato sulla stessa classe in cui è presente l'array mutabile. Associare contentArray del controller di array a File's Owner.myMutableArray. Per ogni colonna, collegare Value al controller di array arrangedObjects e aggiungere il percorso della chiave appropriato. Questo ti permetterà di ottenere cose come l'ordinamento degli utenti gratuitamente se ne hai mai bisogno.