¿Puedo manejar el doble toque en UITabbarController?

Necesito manejar la acción de doble toque para volver de una ruta de navigation representada con una vista personalizada.

Normalmente, el doble toque descarta el controller superior ubicado en la stack del controller de navigation. Me gustaría manejar esta acción y hacer otra cosa.

Colocar el código en (BOOL) tabBarController: shouldSelectViewController: no ayuda, ya que no hay diferencia entre el toque simple y el doble.

Gracias.

Tuve que agregar un tapCounter en el tabBarController: shouldSelectViewController: implementación:

self.tapCounter++; // rule out possibility when the user taps on two different tabs very fast BOOL hasTappedTwiceOnOneTab = NO; if(self.previousHandledViewController == viewController) { hasTappedTwiceOnOneTab = YES; } self.previousHandledViewController = viewController; // this code is called in the case when the user tapped twice faster then tapTimeRange CGFloat tapTimeRange = 0.3; if(self.tapCounter == 2 && hasTappedTwiceOnOneTab) { // do something when tapped twice self.tapCounter = 0; return NO; // or YES when you want the default engine process the event } else if(self.tapCounter == 1) { __block BOOL isSameViewControllerSelected = self.selectedViewController == viewController; if(isSameViewControllerSelected) { // do something when tapped once } dispatch_after_delay_on_main_queue(tapTimeRange, ^{ self.tapCounter = 0; // reset the counter in case there is a single tap followed with another one, but with longer time then tapTimeRange }); return NO; // or YES when you want the default engine process the event } 

Esto funciona muy bien sin ninguna llamada api privada. Pero me gustaría saber si hay una manera mejor y less complicada.

Reescribo la respuesta de Vladimír Slovak en Swift 2, en caso de que alguien lo necesite

 var tapCounter : Int = 0 var previousVC = UIViewController() func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool { self.tapCounter++ let hasTappedTwice = self.previousVC == viewController self.previousVC = viewController if self.tapCounter == 2 && hasTappedTwice { self.tapCounter = 0 print ("Double Tapped!") } if self.tapCounter == 1 { let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.3 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue(), { self.tapCounter = 0 }) } return true } 

testing esto:

 @property (nonatomic, assign) NSTimeInterval tapTime; @property (nonatomic, weak) UIViewController *prevVC; - viewDidLoad { self.tabBarController.delegate = self; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970]; NSTimeInterval duration = currentTime - self.tapTime; self.tapTime = currentTime; if (viewController == self.prevVC) { if (duration < 0.35) { // double tap detected! write your code here self.tapTime = 0; } } self.prevVC = viewController; } 

Creo que necesitas usar un toque incluso …

revisa un desbordamiento de stack similar a continuación:

Objective-c: ¿Cómo detectar el doble toque en la vista?