/ / Impide que UITableView reciba dos toques (la animación pop anidada puede resultar en una barra de navegación dañada) - ios, uitableview

Evite que UITableView reciba dos toques (la animación pop anidada puede dar como resultado una barra de navegación dañada) - ios, uitableview

Estoy usando un UITableView en mi aplicación, que cuando se toque utilizará UINavigationController para empujar otro controlador de vista en la pila de controladores de vista del controlador de navegación.

Sin embargo, cuando una celda en la vista de tabla tiene doble † aplicada, tableView:didSelectRowAtIndexPath: se llama dos veces, lo que provocó que el controlador de navegación empuje dos de estos nuevos controladores de vista en la pila y dé como resultado la siguiente salida de consola:

nested pop animation can result in corrupted navigation bar
Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

No es un tema muy importante, porque los usuarios¿no es muy probable que realicen un doble toque en las celdas de la vista de tabla, sin embargo, me preguntaba si existe una solución elegante para evitar este tipo de malversación? (tal vez revisando el controlador de navegación topViewController y posteriormente decidir si el empuje pushViewController: ¿El método realmente debe ser realizado?).

Respuestas

9 para la respuesta № 1

Aquí hay una solución de línea

self.tableView.multipleTouchEnabled = NO;

12 para la respuesta № 2

Solo establece userInteractionEnabled a NO Me gusta esto

en tus viewWillAppear

-(void)viewWillAppear:(BOOL)animated
{

// if you return from another viewController
[tableView setUserinteractionEnabled:YES];

}

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

// do your logic here and at the end just set user interaction to NO
[tableView setUserInteractionEnabled:NO];

}

Esto bloqueará todas las interacciones del usuario con su tableview.


7 para la respuesta № 3

Una solución que encontré para el problema descrito aquí está envolviendo todo mi código didSelectRowAtIndexPath dentro de la siguiente verificación:

    if ([[self navigationController] topViewController] == self) {
[your existing didSelectRowAtIndexPath code here]
}

Esto verifica si otro controlador de vista ya se ha colocado en la parte superior de la pila del controlador de vista (y todavía está esperando que aparezca en la pantalla por alguna razón).

Creo que la propiedad multiTouchEnabledmencionado en otra parte en realidad se refiere a la función multitáctil, que permite que iOS registre varios eventos táctiles simultáneamente (por ejemplo, pellizcar para hacer zoom con dos dedos en la pantalla al mismo tiempo) en lugar de varios toques secuenciales.


6 para la respuesta № 4

Jordan Sorensen modernizado para acelerar:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
if self.navigationController?.topViewController == self
{
self.performSegueWithIdentifier("whatever", sender:self)
}
else{
// uncomment to break in else case print("fasttaper"s superfluous input was ignored")
}
}

0 para la respuesta № 5
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if self.navigationController?.topViewController == self
{
return true
}
else{
return false
}
}

desactiva el toque múltiple en tu celular