2012-09-04 11 views
5

Sono di fronte a un problema con un NSTableView basato su vista in esecuzione su 10.8 (l'obiettivo è 10.7, ma penso che questo non sia rilevante).Come attivare un'azione da un NSTableCellView in vista NSTableView quando si utilizzano i collegamenti

Sto utilizzando un NSTableView e ottengo i valori di contenuto per il mio NSTableCellView personalizzato tramite bind. Io uso l'obejctValue di NSTableCellView per ottenere i miei dati.

Ho aggiunto un pulsante alla mia cella e mi piacerebbe che attivasse un'azione quando si fa clic. Finora sono stato in grado di attivare un'azione solo all'interno della sottoclasse di NSTableCellView.

posso ottenere la riga che è stato cliccato in questo modo, utilizzando la catena:

NSButton *myButton = (NSButton*)sender;  

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview; 

NSInteger rowClicked = [myView rowForView:myButton.superview]; 

Da lì non so come raggiungere il mio App Delegato o il controller in cui è definito l'azione.

Poiché utilizzo le associazioni al cacao, non ho un delegato su NSTableView che possa essere utilizzato per attivare la mia azione.

Avete idea di come potrei parlare al controller?

Molte grazie in anticipo!

risposta

2

Sebbene si stiano utilizzando i binding, è ancora possibile impostare il controller come delegato per la propria vista tabella nel builder dell'interfaccia.

Vedo che è già possibile accedere alla vista tabella dall'interno della cella. L'attività successiva deve essere semplice, basta impostare il delegato della vista tabella come destinazione per l'azione del pulsante.

+0

Grazie, ho trovato il modo in cui hai detto. In realtà era inizialmente sconcertato dal dover fornire la cella. Ma funziona bene. –

3

Grazie per la tua domanda, avvierò anche un'azione da un pulsante su NSTableView. La tua domanda mi ha aiutato a mettermi sulla giusta strada.

Prima di indirizzare la soluzione per trovare il numero di riga su cui è attivato NSTableView. Sono stato in grado di trovare senza sapere il pulsante, nella mia abitudine NSTableView ho installato quanto segue come un primo tentativo:

- (NSInteger)myRowNumber 
{ 
    return [(NSTableView*)self.superview.superview rowForView:self]; 
} 

questo funziona bene, ma è meno robusta. Funziona solo se sai già in dettaglio quanto sei profondo nella gerarchia della vista. Una soluzione più robusta e universale è:

- (NSInteger)myRowNumber 
{ 
    NSTableView* tableView = nil; 
    NSView* mySuperview = self; 

    do 
    { 
     NSView* nextSuper = mySuperview.superview; 
     if (nextSuper == nil) 
     { 
      NSException *exception = 
       [NSException exceptionWithName:@"NSTableView not found." 
        reason:[NSString stringWithFormat:@"%@ search went too deep.", 
        NSStringFromSelector(_cmd)] userInfo:nil]; 
      @throw exception; 
     } 

     if ([nextSuper isKindOfClass:[NSTableView class]]) 
      tableView = (NSTableView*)nextSuper; 
     else 
      mySuperview = mySuperview.superview; 
    } while (tableView == nil); 

    return [tableView rowForView:self]; 
} 

funziona questo non solo a livello NSTableView, ma funziona con qualsiasi cosa installata a qualsiasi livello di sopra di esso, non importa quanto sia complessa la gerarchia della vista.

Per quanto riguarda la parte senza risposta della domanda, ho stabilito un IBOutlet nella mia classe e utilizzando il generatore di interfacce legato al proprietario dei miei file (nel mio caso la mia classe di documento). Una volta che ho avuto un riferimento alla classe a cui stavo inviando il mio messaggio, e il numero di riga, chiamo la funzione. Nel mio caso la chiamata richiedeva che io passassi il numero di riga da cui proviene.

[self.myDoc doSomethingToRow:self.myRowNumber]; 

Ho provato questo e funziona a vari livelli della gerarchia vista sopra NSTableView. E funziona senza dover prima selezionare la riga (che sembra essere assunta nella documentazione di Apples).

saluti, George Lawrence tempesta, Maltby, Washington, USA

1

Utilizzare rowForView: e la catena risponditore

Per rispondere all'azione di un controllo incorporato all'interno di un NSTableCellView, il controllo dovrebbe emettere l'azione al First Responder. In alternativa, è possibile il proprietario di file ma questo è più strettamente accoppiato.

Utilizzare rowForView: nel metodo di azione per determinare quale riga di comando emesso dell'azione:

- (IBAction)revealInFinder:(id)sender { 
    NSInteger row = [self.tableView rowForView:sender]; 
    ... 
} 

L'azione è implementata in una delle classi catena responder. Molto probabilmente, questa sarà la tua istanza sottoclasa NSWindowController. Il rispondente potrebbe anche essere il delegato dell'applicazione; supponendo che il delegato abbia un mezzo per parlare con lo NSTableView.

Vedere l'esempio di Apple TableViewPlayground: Using View-Based NSTableView and NSOutlineView per vederlo in azione.