2009-05-30 11 views

Respuesta

26

Deberá implementar un método de manejo de eventos UIControl en su controlador de vista, y configurarlo como el controlador para todos sus botones. es decir, dentro de su función de -tableView:cellForRowAtIndexPath: que haría algo como:

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

A continuación, el controlador de eventos se vería así:

- (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

corrección leve ... [toques de evento] debe ser [event allTouches] – dizy

+0

¡excelente! esto es exactamente lo que estoy buscando ... gracias ... – mshsayem

6

El siguiente método se llama cuando se selecciona una celda de la tableView:

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

para acceder al número de sección: int section = indexPath.section;

para acceder al número de fila (dentro de la correcta sección): int row = indexPath.row;

+2

Eso no se llama cuando el usuario pulsa un botón en una fila; solo se llama si tocan el fondo de la fila. –

8

Unos pocos pensamientos:

Se puede recorrer la jerarquía de supervista el botón hasta que encuentre un UITableViewCell, a continuación, llamar - (NSIndexPath *) indexPathForCell: celular (UITableViewCell *) en el 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 
    } 
    } 
} 

Usted puede utilizar alternativamente la etiqueta del botón para almacenar un índice de referencia de la fila. Esto solo contiene un entero único, por lo que tiene más sentido cuando tiene una sola sección o cuando administra las filas como una lista plana.

Puede alternativamente subclasificar UITableViewCell para encapsular el botón. Su UITableViewCell podría responder a los eventos de los botones y retransmitir un evento a su propio delegado, pasándose uno mismo. El delegado del evento puede llamar a - (NSIndexPath *) indexPathForCell: (UITableViewCell *) celda en UITableView para obtener la ruta del índice.

1

Agregar puede variable de instancia de su UITableViewCell subclassTo almacenar la ruta del índice de la celda:

NSIndexPath *myIndexPath; 

Al crear la célula en:

cellForIndexPath: 

pase en el indexpath a la recién creada/celda reciclada.

Ahora cuando presiona el botón, simplemente lea la ruta de índice del ivar de su celda.

Cuestiones relacionadas