2012-08-13 40 views
8

He añadido UIButton en UITableViewCells. Tengo cuando el usuario hace clic en el botón que tenemos obtener el indexpath para usar los valores de NSMutableArray. He utilizado el siguiente para obtener la corriente IndexPath,Cómo pasar UITableView IndexPath a UIButton @selector por parámetros en iOS?

[getMeButton addTarget:self action:@selector(resendTheErrorMessage:) forControlEvents:UIControlEventTouchUpInside]; 

-(void) resendTheErrorMessage:(id)sender 
{ 
    NSLog(@"SEnder: %@", sender); 
    //NSLog(@"Index Path : %@", indexpath); 
} 

Puede alguien por favor me ayude a pasar indexpath actual UIButton's @selector. Gracias por adelantado.

EDIT:

Ésta es la salida que recibí de NSLog()

<UIButton: 0x864d420; frame = (225 31; 95 16); opaque = NO; tag = 105; layer = <CALayer: 0x864d570>> 
+0

Puede establecer la etiqueta en sus botones según el número de fila de su celda y luego puede obtener fácilmente el cellIndex. ¿Muestra el código donde agregó su botón en el método cell (cellForRowAtIndexPath :)? – TheTiger

+0

@VakulSaini Gracias. No obtuve el CellIndex del (id) remitente. He editado mi pregunta, mira esto. Gracias. –

+0

Está obteniendo esto porque está imprimiendo el id de 'UIButton'. Ver mi publicación para obtener un CellIndex – TheTiger

Respuesta

30

Añadir su UIButton gusta esta

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setFrame:CGRectMake(10.0, 2.0, 140.0, 40.0)]; 
[btn setTitle:@"ButtonTitle" forState:UIControlStateNormal]; 
[btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
[btn setTag:indexPath.row]; 
[cell.contentView addSubview:btn]; 

y luego obtener su número de etiqueta -

-(void)buttonClicked:(id)sender 
{ 
    NSLog(@"tag number is = %d",[sender tag]); 
    //In this case the tag number of button will be same as your cellIndex. 
    // You can make your cell from this. 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[sender tag] inSection:0]; 
    UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
} 

Nota:encima solución funcionará cuando el tableView tiene sólo 1 sección. Si su tableView tiene más de una sección, debe conocer el índice de su sección o ir a los métodos a continuación.

alternativa: 1

UIView *contentView = (UIView *)[sender superview]; 
UITableViewCell *cell = (UITableViewCell *)[contentView superview]; 
NSIndexPath *indexPath = [tblView indexPathForCell:cell]; 

alternativa: 2

CGPoint touchPoint = [sender convertPoint:CGPointZero toView:tblView]; 
NSIndexPath *indexPath = [tblView indexPathForRowAtPoint:touchPoint]; 
UITableViewCell *cell = [tblView cellForRowAtIndexPath:indexPath]; 
+0

¿Funciona esto cuando el TableView tiene más de una sección? –

+1

Primero, no funcionará porque en este deberás saber el índice de la sección .... pero la solución alternativa funcionará ...... – TheTiger

+0

@TheTiger gracias, es completamente trabajo ... – Ryuk

2

Si sólo necesita la fila de la tabla, a continuación, puede establecer la propiedad etiqueta del botón para el número de fila. Si necesita la ruta completa (con número de sección), deberá subclase UIButton y crear una nueva propiedad ("indexPath" sería un buen nombre) que establecería cuando agregue el botón a la fila de la tabla.

+0

No creo que esto funcione. AFAIK no puedes pasar tus propios parámetros en una acción: @selector? –

+0

¿Qué parte no funcionaría? No se requieren parámetros adicionales; la idea es codificar la información de índice en el objeto de botón en sí en el momento en que se agrega a la tabla, ya sea a través de la propiedad de etiqueta o una propiedad personalizada de una subclase. El método de etiqueta es lo que se usa en la respuesta aceptada para esta pregunta. – sgress454

6

Dado que el botón es un subvista de la vista de la célula, y que la vista de tabla conoce el índice ruta de la vista de celda, algo como esto funcionaría:

- (UITableViewCell *)containingCellForView:(UIView *)view 
{ 
    if (!view.superview) 
     return nil; 

    if ([view.superview isKindOfClass:[UITableViewCell class]]) 
     return (UITableViewCell *)view.superview; 

    return [self containingCellForView:view.superview]; 
} 

- (IBAction)buttonClicked:(id)sender 
{ 
    UITableViewCell *containingCell = [self containingCellForView:sender]; 
    if (containingCell) { 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:containingCell]; 
     NSLog(@"Section: %i Row: %i", indexPath.section, indexPath.row); 
    } 
} 
+0

Esto funcionará, pero tienes para asegurarse de que el botón sea una subvista * directa * de la celda de la tabla (que normalmente será). – sgress454

+0

Y agregar subView para dirigir cell.view no es bueno ...! Lo agregamos en cell.contentView ... La buena idea es buena :-) – TheTiger

+0

Es bueno si la configura como la vista accesoria de la celda: la pregunta original no especificaba dónde se estaba agregando. Obviamente, si hay n niveles abajo en una jerarquía de vista, entonces tiene que volver a subir n niveles para llegar a la vista de celda. –

0

para mí funciona si la etiqueta añadir a botón en la cellForRowAtIndexPath ...

cell.button.tag = indexPath.row; 

y en la clase de células reciben la etiqueta ... Por ejemplo:

NSLog(@"tag number is = %d",[sender tag]); 

whit que pueda conoce el cell.row. bien esto funciona para mí, lo siento por mi inglés.

1

Para una tableview con más de una sección de una solución más sencilla sería asignar la etiqueta:

cell.button.tag = indexPath.section * 1000 + indexPath.row 

En el uso de controlador de eventos:

let section = sender.tag/1000 
let row = sender.tag % 1000 

Tenga en cuenta que es necesario multiplicar con una número más grande que 1000 si cualquiera de sus secciones puede contener 1000 o más filas.

Cuestiones relacionadas