2009-05-27 9 views
10

Ho una cella di campo di testo in una vista tabella, da cui devo essere reso consapevole quando termina la modifica. Ho pensato di impostare la mia classe Controller come delegato della cella del campo di testo e quindi utilizzare il metodo delegato di NSTextField textDidEndEditing :, ma ho capito che la cella del campo di testo non sembra avere metodi delegati? Perché è questo e cosa posso fare (oltre alla sottoclasse) per essere informato quando la modifica è finita?Delegato NSTextFieldCell?

Grazie

risposta

14

NSTextFieldCell eredita da NSCell (così, tecnicamente da NSActionCell che eredita da NSCell). La classe NSCell viene utilizzata per (dalla docs):

classe NSCell fornisce un meccanismo per la visualizzazione del testo o immagini in un oggetto NSView senza il sovraccarico di un intero NSView sottoclasse.

In particolare, la classe di cellule viene utilizzata per "la visualizzazione di testo o immagini", e non si tratta di interazione con l'utente. Analogamente, con la classe NSTextField:

La classe NSTextField utilizza la classe NSTextFieldCell per implementare la sua interfaccia utente.

Le NSTextField offerte con l'input utente effettivo, mentre utilizzando il cellulare campo di testo per implementare semplicemente la sua interfaccia utente, e allo stesso modo, i metodi delegato per fornire la notifica quando la redazione del testo è terminata viene fornito attraverso la classe NSTextField e non attraverso la classe NSTextFieldCell.

Se si desidera essere avvisati di quando la modifica si conclude in un NSTableView, allora avete bisogno di registrarsi come un osservatore del NSTextDidEndEditingNotification (si potrebbe desiderare di leggere il riferimento NSNotificationCenter classe se non si ha familiarità con le notifiche). Per fare ciò, inserisci quanto segue nella tua classe controller; la funzione awakeFromNib è un buon posto per includerlo per garantire che essi siano stati chiamati avvio dell'applicazione:

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
[nc addObserver:self 
     selector:@selector(textDidEndEditing:) 
      name:NSTextDidEndEditingNotification 
     object:tableView]; 

Dove tableView è il puntatore al NSTableView oggetto. Quindi, è sufficiente implementare il metodo come segue:

- (void)textDidEndEditing:(NSNotification *)aNotification 
{ 
    // Do what you want here 
} 

Non dimenticare di rimuovere se stessi in qualità di osservatore su deallocazione:

- (void)dealloc 
{ 
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc removeObserver:self]; 
} 

La ragione per cui si imposta l'oggetto che si sta osservando di essere il L'istanza NSTableView (e non la cella stessa) è quella sotto il cofano, quando si modifica una cella nella tabella, la cella con cui si ha a che fare non viene modificata direttamente; è l'editor di campo della finestra (o personalizzato). Al termine della modifica, l'editor di campi passa quindi il nuovo valore per quella cella alla visualizzazione tabella. Tuttavia la vista tabella pubblicherà una notifica per dire che una cella ha finito di essere modificata.

+0

Ho trovato che il metodo "TextDidEndEditing:" funziona, ma non il metodo "TextDidBeginEditing:". Hai qualche idea? – Yun

0

Implementare il metodo tableView:setObjectValue:forTableColumn:row: nel protocollo NSTableViewDataSource. Mettilo accanto al metodo tableView:objectValueForTableColumn:row: che hai già implementato.

- (void)tableView:(NSTableView *)aTableView 
    setObjectValue:(id)anObject 
    forTableColumn:(NSTableColumn *)aTableColumn 
       row:(NSInteger)rowIndex 
{ 
    [mutableArrayWithStrings replaceObjectAtIndex:rowIndex withObject:anObject]; 
}