Lamentablemente, ese método no se llama a menos que se toque el tipo de botón interno que se proporciona cuando usa uno de los tipos predefinidos. Para usar el suyo, tendrá que crear su accesorio como un botón u otra subclase de UIControl (recomendaría un botón usando -buttonWithType:UIButtonTypeCustom
y configurando la imagen del botón, en lugar de usar un UIImageView).
Aquí hay algunas cosas que uso en Outpost, que personaliza lo suficiente de los widgets estándar (solo un poco, para que coincida con nuestro color verde azulado) que terminé haciendo mi propia subclase intermediaria UITableViewController para contener el código de utilidad para todas las demás vistas de tabla para usar (ahora subclase OPTableViewController).
En primer lugar, esta función devuelve un nuevo botón de divulgación de detalles utilizando nuestro gráfico personalizado:
- (UIButton *) makeDetailDisclosureButton
{
UIButton * button = [UIButton outpostDetailDisclosureButton];
[button addTarget: self
action: @selector(accessoryButtonTapped:withEvent:)
forControlEvents: UIControlEventTouchUpInside];
return ( button );
}
El botón llamará a esta rutina cuando termine, que luego alimenta la rutina estándar UITableViewDelegate para botones accesorios:
- (void) accessoryButtonTapped: (UIControl *) button withEvent: (UIEvent *) event
{
NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint: [[[event touchesForView: button] anyObject] locationInView: self.tableView]];
if ( indexPath == nil )
return;
[self.tableView.delegate tableView: self.tableView accessoryButtonTappedForRowWithIndexPath: indexPath];
}
Esta función localiza la fila al obtener la ubicación en la vista de tabla de un toque del evento proporcionado por el botón y solicita a la vista de tabla la ruta de índice de la fila en ese punto.
self.tableView
. ¿Qué pasa si no sabe qué vista de tabla contiene la fila?Este sitio web me pareció muy útil: vista de accesorios personalizados para su uitableview en iphone
En resumen, use esto en
cellForRowAtIndexPath:
:luego, implemente este método:
fuente
Mi enfoque es crear una
UITableViewCell
subclase y encapsular la lógica que llamará alUITableViewDelegate
método habitual dentro de ella.fuente
button.superview
,cell.superview
y[tableView.delegate tableView:...]
no son lo suficientemente seguros.Una extensión a la respuesta de Jim Dovey arriba:
Tenga cuidado cuando use un UISearchBarController con su UITableView. En ese caso, desea verificar
self.searchDisplayController.active
y usar enself.searchDisplayController.searchResultsTableView
lugar deself.tableView
. De lo contrario, obtendrá resultados inesperados cuando searchDisplayController esté activo, especialmente cuando se desplazan los resultados de búsqueda.Por ejemplo:
fuente
Defina una macro para etiquetas de botones:
Crear botón y establecer el cell.accessoryView al crear una celda
Establezca cell.accessoryView.tag por indexPath en el método UITableViewDataSource -tableView: cellForRowAtIndexPath:
Manejador de eventos para botones
Implemente el método UITableViewDelegate
fuente
tag
menos que sea absolutamente necesario, busque otra solución.Cuando se toca el botón, puede hacer que llame al siguiente método dentro de una subclase UITableViewCell
fuente
Con el enfoque yanchenko tuve que agregar:
[accBtn setFrame:CGRectMake(0, 0, 20, 20)];
Si está utilizando el archivo xib para personalizar su tableCell, entonces initWithStyle: reuseIdentifier: no se llamará.
En su lugar, anular:
fuente
Debe usar a
UIControl
para obtener correctamente el envío de eventos (por ejemplo aUIButton
) en lugar de simpleUIView/UIImageView
.fuente
Swift 5
Este enfoque utiliza el
UIButton.tag
para almacenar el indexPath utilizando el desplazamiento de bits básico. El enfoque funcionará en sistemas de 32 y 64 bits siempre que no tenga más de 65535 secciones o filas.fuente
A partir de iOS 3.2, puede evitar los botones que otros recomiendan y usar su UIImageView con un reconocedor de gestos táctiles. Asegúrese de habilitar la interacción del usuario, que está desactivada de manera predeterminada en UIImageViews.
fuente