InteractivePopGestureRecognizer вызывает зависание приложения

В моем приложении у меня есть разные контроллеры. Когда я нажимаю контроллер1 на контроллер навигации и проведу назад, все работает хорошо. Но если я нажимаю навигационный контроллер1, а в контроллер1 нажимаю контроллер2 и пытаюсь провести назад, я получаю замороженное приложение. Если вернуться через кнопку назад, все работает нормально.

Как я могу поймать проблему?

Ответ 1

У меня была схожая проблема с замораживающим интерфейсом при использовании жестов swipe-to-pop. В моем случае проблема была в контроллере1.viewDidAppear. Я отключил жестов: self.navigationController.interactivePopGestureRecognizer.enabled = NO. Поэтому, когда пользователь начал отбрасывать обратно из contorller2, был запущен controller1.viewDidAppear, и жест был отключен, прямо во время работы.

Я решил это, установив self.navigationController.interactivePopGestureRecognizer.delegate = self в контроллер1 и внедряя gestureRecognizerShouldBegin: вместо отключения распознавателя жестов:

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

Ответ 2

Мое решение состояло в том, чтобы добавить делегата в контроллер навигации. Затем отключите распознаватель распознавания поцелуев только в контроллере корневого представления. YMMV.

#pragma mark - UINavigationControllerDelegate

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

Ответ 3

У меня была такая же проблема, и я нашел решение ниже. добавить контроллер ниже

#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/

Ответ 4

Мое решение - обмен self.navigationController.interactivePopGestureRecognizer.delegate между selfImplementDelegate и SystemDelegate

- (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];
}

Ответ 5

Я предлагаю вам попробовать это. Это отлично работает для меня. Вы по-прежнему можете наслаждаться интерактивным проводом.

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

Ответ 6

Swift 4

Добавьте этот код в корневой контроллер навигации

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return self == self.navigationController?.topViewController ? false : true
}

Добавить протокол UIGestureRecognizerDelegate

self.navigationController?.interactivePopGestureRecognizer?.delegate = self
self.navigationController?.interactivePopGestureRecognizer?.isEnabled = true