2014-01-19 4 views
10

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

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

+0

Когда он зависает, что отображается, если вы приостанавливаете приложение с помощью отладчика? Любой журнал/исключение? – Wain

+1

Ваша проблема, скорее всего, заключается в 'viewWillDisappear' всплывающего VC и/или' viewWillAppear' VC, к которому вы входите. Поделитесь некоторым кодом, если это возможно. – n00bProgrammer

ответ

22

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

Я решил, установив self.navigationController.interactivePopGestureRecognizer.delegate = self в controller1 и реализации gestureRecognizerShouldBegin:, вместо того, чтобы отключить жест распознаватель:

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

Я сделал аналогичное решение - в viewWillAppear установил флаг False и в viewDidAppear setFlag - True. В gestureRecognizerShouldBegin я проверяю это значение на True, чтобы включить жест. Ваше решение выглядит более элегантным, я постараюсь сделать это и скажу результат. Спасибо за ответ – Multix

+0

Если вы не устанавливаете 'self.navigationController.interactivePopGestureRecognizer.delegate = self' в' controller2', 'controller1' получит вызовы делегатов после нажатия' controller2'. – derpoliuk

+0

Я пошел с подклассификацией UINavigationController и выполнил его делегирование, чтобы включить/отключить распознаватель здесь: http://stackoverflow.com/a/41619830/954643 – qix

0

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

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

12

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

#pragma mark - UINavigationControllerDelegate 

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

Я потратил часы на то, почему приложение висит, вы сэр потрясающие, спасибо для самого элегантного ответа! Исправлена ​​ошибка. Как только я нажал VC, который стал интерактивным делегатом vc, когда я вернусь к корневому vc, и продержусь с левого края, а затем снова нажму vc, буду висеть каждый раз, это исправляет его! – Kevin

+0

этот вопрос замучил меня так много !! Спасибо большое! – Linc

0

Мое решение обмен 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]; 
} 
+0

Это на самом деле правильная причина этой проблемы. делегат, заданный пользователем, переопределяет делегат по умолчанию для навигации по умолчанию. Возврат в нуль недостаточен. Но я не буду использовать это решение в производстве из-за неприятного глобального состояния. – AmitP

0

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

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] && 
     gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) { 
    if(self.navigationController.viewControllers.count<=1) 
    { 
     return NO; 
    } 
    } 
    return YES; 
} 
Смежные вопросы