2013-02-02 3 views
6

Sto cercando di creare un semplice NSTableView (solo testo) in cui è possibile fare clic sulle viste della cella per modificare il testo. Tutti i tutorial e le domande correlate qui suggeriscono che questo è il comportamento automatico, ma non riesco a ottenerlo.Impossibile rendere modificabile NSTableView tramite clic

Non ho problemi a collegare il mio delegato e le origini dati; Posso popolare tutte le celle a livello di codice e riesco a capire cosa fare con il nuovo testo inserito in fase di modifica. ... Non riesco a far aprire la casella di testo per la modifica!

(Le colonne NSTable sono contrassegnati come modificabili in IB)

Grazie per indizi.

+0

OK, nessuna risposta, ma chiunque potrebbe confermare che almeno questo _should_ possibile, di fare clic/doppio clic su una cella in una NSTableView che apre il campo di testo per la modifica? Sto cominciando a chiedermi se la mia installazione Xcode non funziona. In ogni tutorial che riesco a trovare, questo è considerato come un comportamento normale senza alcuna spiegazione su come crearlo. Grazie. –

+1

Risulta che non è un comportamento predefinito, né impostabile globalmente in IB. Devi codificare manualmente ogni cella per essere modificabile mentre li crei nella tua origine dati/delegato. –

+0

Ho la stessa domanda. Se puoi fornire maggiori dettagli in una risposta ufficiale, sarebbe fantastico. – Brett

risposta

6

Nel metodo tableView: viewForTableColumn delegate, ho dovuto impostare in modo specifico ogni cella per essere modificabile.

Sembra funzionare senza problemi dopo un paio di settimane di utilizzo, ma continuo a pensare che in qualche modo ci debba essere un metodo meno laborioso.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 


    NSTableCellView *cellView; 
    if([tableColumn.identifier isEqualToString:@"word"]) 
    { 
     wordCellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     cellView = wordCellView; 
     [cellView.textField setEditable:YES]; // Make Cell Editable! 
    } 
} 
+0

Impostarlo modificabile è stata la chiave per me! Grazie! – Brett

+2

Devi restituire 'cellView' alla fine, giusto? – Arc676

+0

Ottima idea, ma in effetti non è necessaria; vedi http://stackoverflow.com/a/28282459/341994. – matt

7

È possibile farlo in Interface Builder selezionando la cella Campo di testo, quindi utilizzando l'inspector Attributi, scorrere fino al menu a tendina dal titolo "Comportamento" e scegliere "modificabile".

Questo solo consentirà di essere in grado di fare doppio clic su singole celle e farle diventare un campo di testo modificabile.

Per rendere le modifiche apportate hanno un effetto, si avrà anche per implementare il seguente metodo dal protocollo NSTableViewDelegate: - (void) tableView: setObjectValue: forTableColumn: consecutive:

[Vedi di Apple Documenti per questa funzione] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSTableViewDataSource/tableView:objectValueForTableColumn:row :)

Come al solito, questo metodo dovrà essere implementato nell'oggetto che è stato impostato come delegato per l'oggetto NSTableView.

[Vedere di Apple Docs delegati nel caso si desideri una recensione di loro] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18)

+0

Credo che nonostante i link che hai fornito possano essere coerenti con la tua risposta, ma che ora la documentazione di Apple dice che la tecnica che hai specificato nella tua risposta era solo per le visualizzazioni delle tabelle basate su celle. Ora, Apple consiglia di utilizzare le visualizzazioni delle tabelle basate sulla vista e invece di utilizzare il metodo delegate, - (void) tableView: setObjectValue: forTableColumn: row: per impostare i valori che utilizziamo target/action. Qualcuno può dirmi come consentire all'utente di modificare i valori di un TableView e riportare tali valori nel mio modello, usando target/azione? – Kaydell