Tengo un controlador de vista de tabla que muestra una fila de celdas. Cada celda tiene 3 botones. He numerado las etiquetas de cada celda para que sean 1,2,3. El problema es que no sé cómo encontrar en qué celda se presiona un botón. Actualmente, solo obtengo la etiqueta del remitente cuando se presiona uno de los botones. ¿Hay alguna forma de obtener el número de fila de celda también cuando se presiona un botón?
fuente
convertPoint:*to*View
no lo esconvertPoint:*from*View
. Usé el autocompletado de Xcode y terminé con el método fromView que solo llevó a que no funcionara ...Editar: esta respuesta está desactualizada. Utilice este método en su lugar
Prueba esto:
-(void)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCell *buttonCell = (UITableViewCell *)[senderButton superview]; UITableView* table = (UITableView *)[buttonCell superview]; NSIndexPath* pathOfTheCell = [table indexPathForCell:buttonCell]; NSInteger rowOfTheCell = [pathOfTheCell row]; NSLog(@"rowofthecell %d", rowOfTheCell); }
Editar: si está usando contentView, use esto para buttonCell en su lugar:
UITableViewCell *buttonCell = (UITableViewCell *)senderButton.superview.superview;
fuente
contentView
propiedad, por lo que esta solución realmente no funciona.Recomendaría esta forma de obtener indexPath de la celda que tiene una subvista personalizada ( compatible con iOS 7 y todas las versiones anteriores )
-(void)button1Tapped:(id)sender { //- (void)cellSubviewTapped:(UIGestureRecognizer *)gestureRecognizer { // UIView *parentCell = gestureRecognizer.view.superview; UIView *parentCell = sender.superview; while (![parentCell isKindOfClass:[UITableViewCell class]]) { // iOS 7 onwards the table cell hierachy has changed. parentCell = parentCell.superview; } UIView *parentView = parentCell.superview; while (![parentView isKindOfClass:[UITableView class]]) { // iOS 7 onwards the table cell hierachy has changed. parentView = parentView.superview; } UITableView *tableView = (UITableView *)parentView; NSIndexPath *indexPath = [tableView indexPathForCell:(UITableViewCell *)parentCell]; NSLog(@"indexPath = %@", indexPath); }
Esto tampoco requiere
self.tablview
.Además, observe el código comentado que es útil si desea lo mismo a través de un @selector de UIGestureRecognizer agregado a su subvista personalizada.
fuente
Hay dos maneras:
@ H2CO3 tiene razón. Puede hacer lo que sugirió @ user523234, pero con un pequeño cambio, para respetar el UITableViewCellContentView que debería estar entre UIButton y UITableViewCell. Entonces, para modificar su código:
- (IBAction)button1Tapped:(id)sender { UIButton *senderButton = (UIButton *)sender; UITableViewCellContentView *cellContentView = (UITableViewCellContentView *)senderButton.superview; UITableViewCell *tableViewCell = (UITableViewCell *)cellContentView.superview; UITableView* tableView = (UITableView *)tableViewCell.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:tableViewCell]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
Si crea una UITableViewCell personalizada (su propia subclase), simplemente puede llamar
self
a IBAction. Puede vincular la función IBAction a su botón utilizando un guión gráfico o mediante programación cuando configure la celda.- (IBAction)button1Tapped:(id)sender { UITableView* tableView = (UITableView *)self.superview; NSIndexPath* pathOfTheCell = [tableView indexPathForCell:self]; NSInteger rowOfTheCell = pathOfTheCell.row; NSLog(@"rowofthecell %d", rowOfTheCell); }
fuente
Supongo que agrega botones a la celda
cellForRowAtIndexPath
, luego lo que haría es crear una subclase de clase personalizadaUIButton
, agregar una etiqueta llamadarowNumber
y agregar esos datos mientras agrega un botón a la celda.fuente
UIButton
para ello.tag
es una propiedad común deUIView
.Otra forma sencilla:
Obtenga el punto de contacto en tableView
Luego obtenga la ruta del índice de la celda en el punto
La ruta del índice contiene el índice de la fila
El codigo es:
- (void)buttonTapped:(id)sender { UITapGestureRecognizer *tap = (UITapGestureRecognizer *)sender; CGPoint point = [tap locationInView:theTableView]; NSIndexPath *theIndexPath = [theTableView indexPathForRowAtPoint:point]; NSInteger theRowIndex = theIndexPath.row; // do your stuff here // ... }
fuente
Swift 3
Nota: Esto realmente debería ir en la respuesta aceptada anterior, excepto que meta frunce el ceño ante tales ediciones.
@IBAction func doSomething(_ sender: UIButton) { let buttonPosition = sender.convert(CGPoint(), to: tableView) let index = tableView.indexPathForRow(at: buttonPosition) }
Dos comentarios menores:
fuente
Una solución podría ser verificar la etiqueta de la supervista del botón o incluso más arriba en la jerarquía de vista (si el botón está en la vista de contenido de la celda).
fuente
Me gustaría compartir el código en rápido.
extension UITableView { func indexPathForCellContainingView(view1:UIView?)->NSIndexPath? { var view = view1; while view != nil { if (view?.isKindOfClass(UITableViewCell) == true) { return self.indexPathForCell(view as! UITableViewCell)! } else { view = view?.superview; } } return nil } }
fuente
En rápido:
@IBAction func buttonAction(_ sender: UIButton) { guard let indexPath = tableView.indexPathForRow(at: sender.convert(CGPoint(), to: tableView)) else { return } // do something }
fuente