que - iPhone: cómo determinar en qué celda se presionó un botón en un UITableViewCell personalizado
como desactivar el boton home del iphone (10)
Actualmente tengo un UITableView que se rellena con un UITableViewCell personalizado que se encuentra en una punta separada. En la celda, hay dos botones que están conectados a acciones en la clase de celda personalizada. Cuando hago clic en uno de los botones, puedo llamar al método apropiado, pero necesito saber en qué fila se presionó el botón. La propiedad de etiqueta para cada botón viene como 0. No necesito saber cuándo se va a usar toda la celda. está seleccionado, justo cuando se presiona un botón en particular, así que necesito saber qué fila es para poder actualizar el objeto adecuado.
Aún más fácil:
-(IBAction) buttonPressed {
NSIndexPath *myIndexPath = [(UITableView *)self.superview indexPathForCell: self];
// do whatever you need to do with the information
}
Aquí hay un ejemplo rápido ...
La clase UIControl es la superclase de varios widgets de iOS, incluido UIButton, porque UIControl proporciona el mecanismo de destino / acción que envía las notificaciones de eventos. Por lo tanto, una forma genérica de manejar esto es la siguiente:
func actionHandler(control: UIControl)
var indexPath = tableView.indexPathForCell(control.superview!.superview! as UITableViewCell)!
var row = indexPath.row
}
Aquí hay un ejemplo de cómo configurar un control de botón para ejecutar la acción. Alternativamente, cree una @IBAction y cree la acción visualmente con Interface Builder.
button.addTarget(self, action: "actionHandler:", forControlEvents: .TouchUpInside)
Puede bajar el parámetro UIControl a UIButton, UIStepper, etc ... según sea necesario. Por ejemplo:
var button = control as UIButton
La supervisión de control es la vista de contenido de la UITableViewCell, cuyas subvistas son las vistas UIV que se muestran en la celda (UIControl es una subclase de UIView). La supervisión de la celda de contenido es el propio UITableViewCell. Es por eso que este es un mecanismo confiable y las supervisiones se pueden atravesar con impunidad.
Esta solución también funciona en IBAction conectado mediante el prototipo de celda del storyboard.
- (IBAction)viewMapPostsMarker:(UIButton*)sender{
// button > cellContentView > cellScrollView > cell
UITableViewCell *cell = (UITableViewCell *) sender.superview.superview.superview;
NSIndexPath *index = [self.mapPostsView indexPathForCell:cell];
NSLog(@" cell at index %d",index.row);
}
Existen múltiples métodos para solucionar el problema.
- Puede utilizar la propiedad "etiqueta". Indique el valor indexPath.row como valor de etiqueta para el botón.
btn.tag = indexPath.row;
Luego, en la función de botón, puede acceder fácilmente al valor de etiqueta y será el índice para el botón en el que se hizo clic.
-(void)btnClicked:(id)sender
{
int index = [sender tag];
}
Puede usar la propiedad de capa Agregar el indexPath como el valor en el diccionario de capa.
[[capa btn] setValue: indexPath forKey: @ "indexPath"];
Esta indexPath es accesible desde la función de acción del botón.
-(void)btnClicked:(id)sender
{
NSIndexPath *indexPath = [[sender layer] valueForKey:@"indexPath"];
int index = indexPath.row;
}
Con este método, puede pasar varios valores a la función del botón simplemente agregando nuevos objetos en el diccionario con diferentes teclas.
Para una implementación que no depende de las etiquetas o la jerarquía de vistas, haga lo siguiente
- (void)btnPressed:(id)sender event:(id)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchPoint = [touch locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:touchPoint];
}
Puede acceder a la superview
botones para obtener el UITableViewCell
que contiene su botón, pero si solo necesita el número de fila, puede usar la propiedad de tag
como se describe en la publicación anterior.
Puede usar la propiedad de tag
en el botón para especificar en qué fila se creó el botón, si no está usando etiquetas para otra cosa.
Tengo el mismo escenario. Para lograr esto, obtuve una celda personalizada. Agregué dos propiedades, sección y fila. También agregué un propietario, que sería mi clase derivada de TableViewController. Cuando se solicitan las celdas, configuro la sección / fila según la indexPath, junto con el propietario.
cell.section = indexPath.section cell.row = indexPath.row cell.owner = self
Lo siguiente que hice fue cuando creé los botones, asocio los eventos de los botones con la celda en lugar de con el tableViewController. El controlador de eventos puede leer la sección y la entrada de la fila y enviar el mensaje (o evento) apropiado al TableViewController. Esto simplifica enormemente el mantenimiento y el mantenimiento de la casa al aprovechar los métodos existentes y la limpieza y mantener la celda lo más autónoma posible. Dado que el sistema ya realiza un seguimiento de las células, ¿por qué hacerlo dos veces?
Una solución mucho más sencilla es definir la devolución de llamada de su botón con el remitente (id) y usarla para extraer el índice de la fila de la tabla. Aquí hay un código de ejemplo:
- (IBAction)buttonWasPressed:(id)sender
{
NSIndexPath *indexPath =
[self.myTableView
indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
NSUInteger row = indexPath.row;
// Do something with row index
}
Lo más probable es que haya utilizado el mismo índice de fila para crear / rellenar la celda, por lo que debería ser trivial identificar qué debe hacer ahora su botón. ¡No es necesario jugar con las etiquetas y tratar de mantenerlas en orden!
Aclaración: si actualmente utiliza - (IBAction) buttonWasPressed; solo redefínelo como - (IBAction) buttonWasPressed: (id) sender; El argumento adicional de devolución de llamada está ahí, no hay necesidad de hacer nada extra para obtenerlo. ¡También recuerde volver a conectar su botón a la nueva devolución de llamada en Interface Builder!
[btnFavroite setAccessibilityValue:[NSString stringWithFormat:@"%d",indexPath.row]];
[btnFavroite setAccessibilityLabel:btnFavroite.titleLabel.text];
[btnFavroite addTarget:self action:@selector(btnFavClick:) forControlEvents:UIControlEventTouchUpInside];
-(void)btnFavClick:(id)sender{
UIButton *btn=(UIButton *)sender;
int index=[btn.accessibilityValue integerValue]]
}