Недавно я застрял в ошибке нажатия UIViewController
на UINavigationViewController
, и я нашел решение для этого.
Сценарий ошибки:
это не 'Не имеет значения, как вы нажимаете UIViewController
(по ходу дела, используя pushViewController, ..).В RootViewController вашего NavigationViewController попробуйте использовать жест смахивания назад!(ничего не должно происходить), затем попытайтесь вставить ViewController в ваш NavigationViewController, коснувшись элемента.=> Приложение зависает!Здесь, если вы захватите экран с помощью XCode, вы увидите, что текущий видимый экран - это следующий экран !!(но это не так!), использование процессора и любые другие вещи являются нормальными. Вы можете выйти из «Замораживания приложения», просто взмахом пальца!
Вот решение:
В вашем BaseNavigationViewController (который расширяет UINavigationViewController
) вставьте эти коды(особенно когда вы используете UITabbarNavigationViewController
)
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate {
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
if (self.viewControllers.count > 1) {
self.interactivePopGestureRecognizer.delegate = self;
self.interactivePopGestureRecognizer.enabled = YES;
} else {
self.interactivePopGestureRecognizer.delegate = nil;
self.interactivePopGestureRecognizer.enabled = NO;
}
}
}
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
return self.viewControllers.count > 1;
}
return NO;
}
Не забудьте также написать эти коды:
в viewDidLoad
BaseNavigationViewController:
self.delegate = self;
и ваш BaseNavigationViewController
должен использовать эти два протокола: UINavigationControllerDelegate
, UIGestureRecognizerDelegate