2012-04-18 19 views
7

Come si ottiene la riga per un pulsante in una tabella basata sulla vista quando si fa clic sul pulsante? La riga non è selezionata quando si fa clic sul pulsante, ma ho rilevato che se si registra sender.superview.superview nel metodo di azione del pulsante, viene visualizzato: NSTableRowView: 0x1001b3a90 - row: 2. Quindi, la riga è presente nel registro, ma non so come ottenerlo a livello di programmazione. Ho il metodo di azione del pulsante in una sottoclasse di NSTableCellView.Visualizza tabella basata su pulsante nella vista

risposta

8

-[NSTableView rowForView:] dice questo nella sua documentazione:

Questo è in genere necessario nel metodo d'azione per un NSButton (o NSControl) per scoprire cosa riga (e colonna) l'azione deve essere eseguita su.

+0

Grazie, questo è quello che mi serviva. Posso ottenere la visualizzazione tabella nel metodo di azione del pulsante da sender.superview.superview.superview e la vista da sender.superview – rdelmar

+0

L'azione deve essere inviata a un controller e il controller deve conoscere la vista tabella. Dovrebbe avere uno sbocco. Quindi, non dovrebbe essere necessario seguire la catena di superview. E puoi semplicemente passare 'sender' come argomento a' -rowForView: ', perché cerca la riga che contiene, direttamente o indirettamente, la vista. –

+0

Stavo facendo alcuni test solo per vedere come potevo manipolare vari elementi dell'interfaccia utente in una tabella basata sulla vista, quindi inizialmente avevo il metodo di azione nell'app delegato (per semplicità) e non è mai stato chiamato. Poi l'ho messo nella visualizzazione cella tabella personalizzata perché ho letto da qualche parte che è dove dovrebbe essere. Come hai detto nel tuo commento, sembra davvero che dovrebbe essere in un oggetto controller, ma c'è qualche restrizione su dove può andare per farlo funzionare? Perché non ha funzionato nel delegato dell'app? Non sono sicuro di come sia la catena di risposta per una tabella basata su viste. – rdelmar

1

Qui vi sto dando un semplice esempio. In questo sto aggiungendo un UIButton nella visualizzazione del contenuto. Quando ho cliccato sul pulsante che io chiamo un metodo e non ottengo il numero di riga e chiamo come ho richiesto

//Adding a button 
    UIButton *btnBuyer=[UIButton buttonWithType:UIButtonTypeCustom]; 
    btnBuyer.frame=CGRectMake(238, 10, 26, 32); 
    btnBuyer.tag=indexPath.row; 
    [btnBuyer setImage:[UIImage imageNamed:@"buyIcon.png"] forState:UIControlStateNormal]; 
    [btnBuyer addTarget:self action:@selector(goBuyTab:)forControlEvents:UIControlEventTouchUpInside]; 
    [cellNew.contentView addSubview:btnBuyer]; 

E quando l'utente fa clic su questo ho avuto Id dalla seguente metodo

-(void)goBuyTab:(UIButton *)sender{ 
    NSLog(@"after click buy button function called goBuyTab"); 
    NSLog(@"sender.tag in goBuyTab : %d",sender.tag); 
    int selectedRow=sender.tag;// This is row number 
} 

Spero che questo è quello che hai richiesto.

-1

in OSX è possibile utilizzare questo metodo di azione nel vostro cellulare pulsante nel controller:

- (IBAction)yourMethod:(NSButtonCell *)sender { 

NSInteger selected = [yourTableView selectedRow]; 
NSLog(@"sender sends :%ld", selected); 
} 

è necessario impostare una presa dal controller al NSTableView.

+0

Questo non sempre funziona perché è perfettamente possibile fare clic su un pulsante di fila senza selezionare la riga sottostante. – Ely

+0

Inoltre non funziona perché (in una vista tabella basata su celle) 'sender' è' 'NSTableView'', non' 'NSButtonCell'. –

0

Condivido questo codice per Swift 4.

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 
    ........ 
    but.action = #selector(ViewController.buttonAction) 
    ......... 
} 

@objc func buttonAction(but: NSButton){ 
    let tablerow: NSTableRowView = but.superview?.superview as! NSTableRowView; 
    let index = table?.row(for: tablerow); 
    print("\(index)); 
} 
Problemi correlati