iphone - didSelectRowAtIndexPath: no se llama
ios uitableview (12)
Tengo una UITableView
como subvista de mi UIScrollVIew
, que es la vista principal controlada por mi MainViewController
.
En MainViewController.h
@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>
// other stuff here...
@property (weak, nonatomic) IBOutlet UITableView *myTableView;
En MainViewController.m
@synthesize myTableView;
// other stuff here...
- (void)viewDidLoad {
myTableView.delegate = self;
myTableView.datasource = self;
}
// other stuff here...
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
[self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}
Sé que didSelectRowAtIndexPath
no se está llamando porque he establecido puntos de interrupción tanto en el método como en la línea de código que didSelectRowAtIndexPath
, y ninguno de los dos se está llamando. También sé que el origen de datos funciona correctamente porque tengo otras funciones que modifican las células en tiempo de ejecución y funcionan perfectamente bien. Estoy utilizando el último Xcode con iOS 5.0 configurado como objetivo de desarrollo. He buscado y buscado una respuesta. ¿Alguien tiene alguna idea?
Editar: he encontrado la respuesta. Tenía un UITapGestureRecognizer
configurado para superView de myTableView. Esto anuló la llamada de selección. Gracias a quien sugirió que podría ser eso. Su respuesta fue eliminada antes de que pudiera marcarla correctamente.
Editar 2: Mucha gente ha estado comentando sobre esto, así que pensé que lo compartiría. Si está experimentando este problema, simplemente establezca myGestureRecognizer.cancelsTouchInView
en false
y todo debería funcionar bien.
Actualizado para Swift 3:
si se usa UITapGestureRecognizer en su código: - # Swift 3 use debajo de las líneas de código:
extension YourViewController{
func hideKeyboardWhenTappedAround() {
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
tap.cancelsTouchesInView = false
}
func dismissKeyboard() {
view.endEditing(true)
}
}
Cómo llamado: - En ViewDidLoad ()
self.hideKeyboardWhenTappedAround()
¿Ha definido la variable de instancia para la vista de tabla con el mismo nombre? Si no, entonces podría ser esta puede ser la cuestión-
_myTableView.delegate = self;
_myTableView.datasource = self;
O-
self.myTableView.delegate = self;
self.myTableView.datasource = self;
Cancele los toques de otras vistas excepto el requerido.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
if (touch.view == your view) {
return YES;
}
return NO;
}
El usuario puede seleccionar una celda (tocando en la fila), llamando a "tableView.selectRowAtIndexPath (..)" o "cell.setSelected (true, ...).
Si la celda se selecciona llamando a "cell.setSelected (true)", el usuario ya no puede anular la selección de la celda.
Si la celda se selecciona llamando a "tableView.selectRowAtIndexPath ()", el usuario puede anular la selección de la celda como se esperaba.
Estuve teniendo este problema por un tiempo, y no vi ninguna referencia aquí, así que como referencia, otra razón para esto podría ser que:
tableView.editing = YES;
pero
tableView.allowsSelectionDuringEditing = NO;
Según la documentación para
- tableView:didSelectRowAtIndexPath:
Este método no se invoca cuando la propiedad de edición de la tabla está establecida en SÍ (es decir, la vista de tabla está en modo de edición). Consulte "Administración de selecciones" en la Guía de programación de Table View para iOS para obtener más información (y ejemplos de código) relacionados con este método.
He encontrado la respuesta. Tenía un UITAPGestureRecognizer configurado para superView de myTableView. Esto anuló la llamada de selección. Gracias a quien sugirió que podría ser eso. Su respuesta fue eliminada antes de que pudiera marcarla correctamente.
Establezca la propiedad cancelsTouchesInView
en NO
en el reconocedor de gestos para permitir que la vista de tabla intercepte el evento.
Lo siento, no tengo suficientes puntos para agregar comentarios. La respuesta de Garret es genial, pero agregaría:
Todavía puede tener su reconocedor de gestos, pero tendrá que establecer ''Cancela toques en la vista'' en NO - luego los gestos se entregarán a la vista y su UITableView funcionará bien.
Después de probar muchos enfoques, esta parece ser la forma correcta de hacer las cosas: un reconocedor de toque con ''cancelar toques en la vista'' es como tener una capa invisible encima de todo lo que atrapa todos los eventos y los dirige al controlador de vista (el proxy) El controlador de vista luego mira el gesto para ver si tiene un enlace de acción (botones, etc.) y los enrutará, y el resto solo irá al controlador de gestos. Cuando se utiliza una UITableView, se espera que reciba el toque, pero el controlador de vista lo analiza cuando tiene ''Cancela toques en la vista''.
Mi caso es extraño My tableView tiene 2 secciones. Las celdas de la primera sección funcionan bien sobre tableView:didSelectRowAt:
pero las celdas de la segunda sección no desencadenan didSelectRowAt:
El problema anterior ocurre en iPhone 4s, iOS 9.3
. Pero en el iPhone 5s, iOS 10.3
, no hay problemas, esas células funcionan bien. Parece que iOS 9
errores sobre UITableView
.
Después de muchas pruebas, descubrí que una línea de códigos produce este error.
tableView.estimatedSectionHeaderHeight = 60.0
Porque la segunda sección no tiene vista de encabezado. Elimino esta línea, y todo funciona bien.
Mi solución es:
establecer
cancelsTouchesInView
aNo
de cualquier tapGestureEncontré en mi celda personalizada,
userInteractionEnable
está establecido enNO
, simplemente elimineuserInteractionEnable = No
y problema resuelto.
Tal vez es un error tipográfico después de todo. Compruebe que su función no es didDeselectRowAtIndexPath:
( de select en lugar de select).
Tu problema es la sensibilidad a mayúsculas / minúsculas. Tu codigo:
- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
debiera ser
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
Tuve fallas intermitentes de didSelectRowAtIndexPath: me llamaron en mi celda personalizada.
Descubrí que si dejaba de llamar a [tableView reloadData] con mucha frecuencia (10 Hz), y lo cambiaba para actualizar cada 2 segundos, casi todas las pulsaciones llamarían con éxito a didSelectRowAtIndexPath:
Parece que volver a cargar la vista bloquea bloques.