IOS 7 interactivePopGestureRecognizer是冻结的应用程序

我有奇怪的错误,我不知道如何捕捉这个问题。 在我的应用程序中有不同的控制器。 当我将控制器1推到导航控制器并滑回时,一切正常。 但是,如果我推导航控制器1,并进入控制器1推控制器2,并尝试刷卡回来 – 我得到一个冻结的应用程序。 如果通过后退button返回 – 一切正常。

我怎样才能抓住我的问题?

使用滑动手势时,我遇到与冻结界面类似的问题。 在我的情况下,问题是在controller1.viewDidAppear我禁用滑动手势: self.navigationController.interactivePopGestureRecognizer.enabled = NO 。 所以当用户开始从控制器2上滑回时,控制器1.viewDidAppear被触发,手势被禁用。

我解决了这个问题,通过在controller1中设置self.navigationController.interactivePopGestureRecognizer.delegate = self来实现gestureRecognizerShouldBegin:而不是禁用手势识别器:

 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] && gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) { return NO; } return YES; } 

我的解决scheme是将一个委托添加到导航控制器。 然后只在根视图控制器中禁用popup手势识别器。 因人而异。

 #pragma mark - UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { BOOL isRootVC = viewController == navigationController.viewControllers.firstObject; navigationController.interactivePopGestureRecognizer.enabled = !isRootVC; } 

我有同样的问题,我发现下面的解决scheme。 添加控制器下面

 #import <UIKit/UIKit.h> @interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate,UINavigationControllerDelegate> @end #import "CBNavigationController.h" @interface CBNavigationController () @end @implementation CBNavigationController - (void)viewDidLoad { NSLog(@"%s",__FUNCTION__); __weak CBNavigationController *weakSelf = self; if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.interactivePopGestureRecognizer.delegate = weakSelf; self.delegate = weakSelf; } } - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { NSLog(@"%s",__FUNCTION__); if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) self.interactivePopGestureRecognizer.enabled = NO; [super pushViewController:viewController animated:animated]; } #pragma mark UINavigationControllerDelegate - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animate { NSLog(@"%s",__FUNCTION__); // Enable the gesture again once the new controller is shown if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) self.interactivePopGestureRecognizer.enabled = YES; } @end 

可以参考下面的链接

http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/

我的解决scheme是在selfImplementDelegateSystemDelegate之间交换self.navigationController.interactivePopGestureRecognizer.delegate

 - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [_tableView reloadData]; _oldReturnDelegate = self.navigationController.interactivePopGestureRecognizer.delegate; self.navigationController.interactivePopGestureRecognizer.delegate = self; } - (void)viewWillDisappear:(BOOL)animated { self.navigationController.interactivePopGestureRecognizer.delegate = _oldReturnDelegate; [super viewWillDisappear:animated]; } 

我build议你试试这个。 这对我来说是完美的。 您仍然可以享受交互式滑动。

 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] && gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) { if(self.navigationController.viewControllers.count<=1) { return NO; } } return YES; } 

我解决了我的问题, UINavigationController interactivePopGestureRecognizer在iOS7中工作exception,并设置self.navigationController.interactivePopGestureRecognizer.delegate = self; 在每个viewcontroller的- (void)viewWillAppear:(BOOL)animated