2009-05-30 6 views

risposta

26

È necessario implementare un metodo di gestione degli eventi UIControl sul controller di visualizzazione e impostarlo come gestore per tutti i pulsanti. vale a dire all'interno della vostra funzione -tableView:cellForRowAtIndexPath: si dovrebbe fare qualcosa di simile:

[theCell.button addTarget: self 
        action: @selector(buttonPressed:withEvent:) 
     forControlEvents: UIControlEventTouchUpInside]; 

Allora il vostro gestore di eventi sarebbe simile a questa:

- (void) buttonPressed: (id) sender withEvent: (UIEvent *) event 
{ 
    UITouch * touch = [[event touches] anyObject]; 
    CGPoint location = [touch locationInView: self.tableView]; 
    NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: location]; 

    /* indexPath contains the index of the row containing the button */ 
    /* do whatever it is you need to do with the row data now */ 
} 
+6

lieve correzione ... [i tocchi dell'evento] dovrebbero essere [evento tuttiTutti] – dizy

+0

grandioso! questo è esattamente quello che sto cercando ... grazie .. – mshsayem

6

il seguente metodo viene chiamato quando si seleziona una cella nella tua tableView:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

per accedere al numero di sezione: int section = indexPath.section;

per accedere il numero di riga (all'interno della corretta sezione): int row = indexPath.row;

+2

che non viene chiamato quando l'utente tocca un pulsante su una riga; viene chiamato solo se toccano lo stesso sfondo della riga. –

8

Qualche considerazione:

È possibile scorrere la gerarchia superview del pulsante fino a trovare un UITableViewCell, quindi chiamare - (NSIndexPath *) indexPathForCell: (UITableViewCell *) cella del UITableView.

- (void)buttonClicked:(id)sender { 
    UIView *button = sender; 

    for (UIView *parent = [button superview]; parent != nil; parent = [parent superview]) { 
    if ([parent isKindOfClass: [UITableViewCell class]]) { 
     UITableViewCell *cell = (UITableViewCell *) parent;   
     NSIndexPath *path = [self.tableView indexPathForCell: cell]; 

     // now use the index path 

     break; // for 
    } 
    } 
} 

È possibile utilizzare alternativamente il tag del pulsante per memorizzare un indice che fa riferimento alla riga. Questo contiene solo un singolo intero, quindi ha più senso quando si ha una singola sezione o quando si gestiscono le righe come un elenco semplice.

È possibile alternare sottoclasse UITableViewCell per incapsulare il pulsante. UITableViewCell potrebbe rispondere agli eventi del pulsante e ritrasmettere un evento al proprio delegato, passando per se stesso. Il delegato dell'evento può quindi chiamare - (NSIndexPath *) indexPathForCell: (UITableViewCell *) cella su UITableView per ottenere il percorso dell'indice.

1

Add può variabile della vostra UITableViewCell subclassTo esempio memorizzare il percorso indice della cella:

NSIndexPath *myIndexPath; 

Quando si crea la cella in:

cellForIndexPath: 

passaggio nell'area di indexpath alla recente creazione/cella riciclata.

Ora, quando si preme il pulsante, basta leggere il percorso dell'indice dall'avar della cella.

Problemi correlati