life example containerviewcontroller container iphone uitableview uiviewcontroller touches

iphone - example - ¿Toca eventos en UITableView?



lifecycle viewcontroller ios (7)

Tengo UIViewController y UITableView como secundarios en la vista, lo que quiero hacer es cuando toco cualquier fila, estoy mostrando una vista en la parte inferior. Quiero ocultar esa vista si el usuario toca en cualquier otro lugar, luego filas o la vista inferior.

El problema es cuando hago clic en UITableView , no se touchesEnded evento touchesEnded .

Ahora, ¿cómo puedo detectar el toque en UITableView y distinguirlo con el evento de selección de fila?

Gracias.


Acabo de tropezar con lo que puede ser una solución para su problema. Use este código cuando cree su vista de tabla:

tableView.canCancelContentTouches = NO;

Sin configurar esto en NO , los eventos táctiles se cancelan tan pronto como haya un ligero movimiento vertical en la vista de tabla (si coloca declaraciones NSLog en su código, verá que touchesCancelled se touchesCancelled tan pronto como la tabla comienza a desplazarse verticalmente).


Debe reenviar el evento táctil al controlador de la vista. Subclase su control tableview y luego anule el método:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; //let the tableview handle cell selection [self.nextResponder touchesBegan:touches withEvent:event]; // give the controller a chance for handling touch events }

entonces, puedes hacer lo que quieras en los métodos táctiles del controlador.


En su clase de controlador, declare un método que elimine la vista inferior. Algo como esto:

-(IBAction)bottomViewRemove:(id)sender { [bottomView removeFromSuperview]; }

En Interface Builder, seleccione su vista y en el inspector de identidad en la sección de clase personalizada, cambie la clase de UIView a UIControl . Luego, vaya al inspector de conexiones y conecte el evento TouchUpInside al método declarado anteriormente. Espero que esto ayude.


Estaba enfrentando el problema desde hace mucho tiempo y no tenía ninguna solución funcional. Finalmente elijo ir con una alternativa. Sé técnicamente que esta no es la solución, pero esto puede ayudar a alguien a buscar lo mismo con seguridad.

En mi caso, quiero seleccionar una fila que muestre alguna opción después de que toco en cualquier lugar de la tabla o Ver Quiero ocultar esas opciones o realizar cualquier tarea, excepto la fila seleccionada previamente para lo que hice a continuación:

  1. Establezca eventos táctiles para la vista. Esto hará la tarea cuando toque en cualquier lugar de la vista, excepto la vista de tabla.

  2. TableView''s didSelectRowAtIndexPath haga lo siguiente

    - (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath { if(indexPath.row != previousSelectedRow && previousSelectedRow != -1) { // hide options or whatever you want to do previousSelectedRow = -1; } else { // show your options or other things previousSelectedRow = indexPath.row; } }

Sé que esta es una publicación anterior y no una buena solución técnica, pero esto funcionó para mí. Estoy publicando esta respuesta porque esto puede ayudar a alguien con seguridad.

Nota: El código escrito aquí puede tener errores ortográficos porque se escribe directamente aquí. :)


No necesita subclasificar nada, puede agregar un UITapGestureRecognizer a UITableView y absorber el gesto o no, según sus criterios.

En su viewDidLoad:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapOnTableView:)]; [self.myTableView addGestureRecognizer:tap];

Luego, implemente su acción de esta manera para los criterios:

-(void) didTapOnTableView:(UIGestureRecognizer*) recognizer { CGPoint tapLocation = [recognizer locationInView:self.myTableView]; NSIndexPath *indexPath = [self.myTableView indexPathForRowAtPoint:tapLocation]; if (indexPath) { //we are in a tableview cell, let the gesture be handled by the view recognizer.cancelsTouchesInView = NO; } else { // anywhere else, do what is needed for your case [self.navigationController popViewControllerAnimated:YES]; } }

Y tenga en cuenta que si simplemente desea obtener clics en cualquier lugar de la tabla, pero no en ningún botón en las filas de la celda, solo necesita usar el primer fragmento de código anterior. Un ejemplo típico es cuando tienes una UITableView y también hay una UISearchBar. Desea eliminar la barra de búsqueda cuando el usuario hace clic, desplaza, etc. la vista de tabla. Ejemplo de código ...

-(void)viewDidLoad { [super viewDidLoad]; etc ... [self _prepareTable]; } -(void)_prepareTable { self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; self.tableView.allowsSelection = NO; etc... UITapGestureRecognizer *anyTouch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tableTap)]; [self.tableView addGestureRecognizer:anyTouch]; } // Always drop the keyboard when the user taps on the table: // This will correctly NOT affect any buttons in cell rows: -(void)tableTap { [self.searchBar resignFirstResponder]; } // You probably also want to drop the keyboard when the user is // scrolling around looking at the table. If so: -(void)scrollViewDidScroll:(UIScrollView *)scrollView { [self.searchBar resignFirstResponder]; } // Finally you may or may not want to drop the keyboard when // a button in one cell row is clicked. If so: -(void)clickedSomeCellButton... { [self.searchBar resignFirstResponder]; ... }

Espero que ayude a alguien.


Para recibir eventos táctiles en el uso de UITableView :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { //<my stuff> [super touchesBegan:touches withEvent:event]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { //<my stuff> [super touchesMoved:touches withEvent:event]; } - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { //<my stuff> [super touchesEnded:touches withEvent:event]; } - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event { //<my stuff> [super touchesCancelled:touches withEvent:event]; }

recibir eventos táctiles en UITableView


Prueba con estos métodos:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { } - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { }

Utilice scrollViewDidEndDragging como alternativa de toquesEnded. Espero eso ayude.