2014-09-29 4 views
4

Я хочу, чтобы отключить поп жест ударяя в ViewController но ниже линии не работают в прошивке 8:self.navigationController.interactivePopGestureRecognizer.enabled = NO; не работает в прошивке 8

self.navigationController.interactivePopGestureRecognizer.enabled = NO; 

Заранее спасибо

+0

Дхара, было предоставлено несколько ответов, вы могли бы выбрать один из них как принятый ответ? – Brabbeldas

+1

Ни один из ответов не работает для iOS 8. :( – sole007

+0

Попробуйте http://stackoverflow.com/a/38202820/199364 или http://stackoverflow.com/a/27600715/199364 – ToolmakerSteve

ответ

4

В ViewController, что вы хотите его быть отключены, добавьте следующую строку:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
     self.navigationController.interactivePopGestureRecognizer.delegate = self; 
    } 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 
     self.navigationController.interactivePopGestureRecognizer.delegate = nil; 
    } 

} 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    return NO; 
} 
+0

, но он не работает в ios 8 – Dhara

+0

Вы уверены в этом? Когда я протестировал вышеуказанный код в iOS 8, и он сработал. – gabbler

+0

self.navigationController.interactivePopGestureRecognizer.enabled = NO; не работает и, возможно, ошибка для iOS 8 – gabbler

1

я использую это решение в моем проекте, он отключает только interactivePopGestureRecognizer и позволяет использовать еще один жест распознаватели.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { 

     self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
     self.navigationController.interactivePopGestureRecognizer.delegate = self; 

    } 

} 


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 

    if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) { 

     return NO; 

    } else { 

     return YES; 

    } 

} 
+0

Это сработало для меня, это должен быть принятый ответ. @Userich, хорошая работа! – Brabbeldas

0

Следующее решение !!!

- (void)viewWillAppear:(BOOL)animated { 
     [super viewWillAppear:animated]; 

     __weak id weakSelf = self; 
     self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf; } 

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

Обычно мы должны реализовать, когда вы вручную добавить панель навигации или когда мы настроены Навигационный контроллер

Swift Версия

Добавить на RootViewController протокол UIGestureRecognizerDelegate и viewWillAppear добавить:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.interactivePopGestureRecognizer!.delegate = self } 
+0

Это работает после решения, вышеперечисленного с iOS 8, но без предупреждений компилятора, поэтому я не уверен, почему голосование от других, пожалуйста, прокомментируйте почему. –

+0

Не представляется полным решением. Если да, тогда объясните, почему это работает. Если это не так, укажите, какой ответ вы изменяете. – ToolmakerSteve

+0

как записать это в swift получил ** 'Не могу присвоить значение типа (VC) для ввода« UIGestureRecognizerDelegate? »** – John

-5
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     self.navigationController.interactivePopGestureRecognizer.enabled = NO; 
    }); 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     self.navigationController.interactivePopGestureRecognizer.enabled = YES; 
    }); 
} 

Я думаю, что простой способ выше. Вы не должны активировать gesture непосредственно в viewDidLoad(). Но вы можете изменить его состояние после viewDidAppeared(). Вы знаете, что это После, :-D

+0

Не делайте этого. Во-первых, неясно, как это решит проблему. Он отключается, а затем через некоторое время разрешает. Что ты пытаешься сделать? Во-вторых, плохой практикой программирования является использование задержек. Нет никакой гарантии, что данная задержка достаточно длинная и все же не слишком длинная - может произойти до того, как будет установлен распознаватель, или произойдет достаточно поздно, чтобы пользователь смог запустить салфетки перед запуском кода. Не используйте задержки; вместо этого используйте методы, которые Apple предоставляет, 'viewWillAppear' или' viewDidAppear', *, как видно из других ответов, опубликованных задолго до вашего ответа *. – ToolmakerSteve