Agregar properties a UIControls sin subclasss

He embedded UIButtons en mis TableViewCells. Para rastrear a qué celda pertenece el button, me gustaría agregar una propiedad NSIndexPath a UIButton. No quiero subclassar un UIButton. ¿Hay alguna manera de que pueda hacer esto con las categorías?

EDIT: Creo que la idea de establecer tags no funcionará si tengo varias secciones en la vista de tabla. Otro método para acceder a la supervisa del supervisor de button para determinar la celda parece más un hack. Buscando una forma más limpia de hacer esto.

Hay varios enfoques. Si realmente necesita un solo número en lugar de una ruta de índice completa, puede usar setTag: Es inflexible, pero está disponible.

La siguiente mejor solución es las references asociativas . Estos pueden colgar datos en cualquier object, con una gestión de memory adecuada. Normalmente creo una categoría que agrega una propiedad implementada usando objc_setAssociatedObject y objc_getAssociatedObject .

Puede averiguar en qué celda se ha hecho clic en un button sin tener que asociar tags o routes de índice con los botones, que pueden volverse desorderados al reutilizar las celdas. Las tags funcionan con tablas seccionadas, pero hay que confundirlas con los numbers; por ejemplo, 10001 es la sección 1, fila 1, por lo que debes convertir en un extremo y convertir de nuevo en el otro, demasiado frágil para mi gusto.

Un método mejor es utilizar el método indexPathForRowAtPoint: . Cuando la acción de su button está activada (suponiendo que el objective está en su controller de vista de tabla:

 CGPoint point = [sender convertPoint:sender.center toView:self.tableView]; NSIndexPath *path = [self.tableView indexPathForRowAtPoint:point]; 

sender aquí se lanza a UIButton .

Para rastrear a qué celda pertenece el button

Ya sabes a qué celda pertenece el button: es la celda en la que el button es una subvista.

  1. Comienza con una reference al button. (Si usted es el button, este es self . Si usted es el objective del button para su acción, entonces cuando se toca el button y emite un post de acción, se pasa a sí mismo como parámetro al post de acción, generalmente llamado sender ).

  2. Busque la jerarquía de vistas ( superview ) para encontrar UIViewTableCell que contiene el button.

     UIView* v = theButton; while (![v isKindOfClass: [UITableViewCell class]]) v = v.superview; 
  3. Ahora puedes hacer lo que quieras con esa información. Por ejemplo, parece que desea un NSIndexPath; luego llame -[UITableView indexPathForCell:] .