2014-09-09 3 views
34

При переключении между вкладками слишком быстро UIPageViewController, приложение получает сбой в линииAssertion в UIPageViewController

[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:] 

с ошибками отказом Assertion и Нагрузочное приложением из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «Нет вид контроллера не управляющий видимый вид.

Error Log, как показано ниже

*** Assertion failure in -[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:], /SourceCache/UIKit/UIKit-3318.0.1/UIPageViewController.m:1875 
2014-09-29 11:34:00.770 Wowcher[193:9460] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'No view controller managing visible view <UIView: 0x1783fa80; frame = (0 0; 320 416); autoresize = W+RM+H+BM; layer = <CALayer: 0x17898540>>' 
*** First throw call stack: 
(0x219fbf87 0x2f15ac77 0x219fbe5d 0x226cb2c9 0x253f9fff 0x2546f8d3 0x2546f6b7 0x2546c2b9 0x254700db 0x25470f97 0x2546d037 0x24ea925f 0x2500a589 0x24ff7eef 0x24ea677d 0x252b8c81 0x24e70105 0x24e6e07f 0x24ea4b6d 0x24ea443d 0x24e7acc5 0x250ee513 0x24e79707 0x219c2807 0x219c1c1b 0x219c0299 0x2190ddb1 0x2190dbc3 0x28c99051 0x24ed9a31 0xd950b 0xca6e0) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

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

+0

взглянуть на http://stackoverflow.com/questions/10576671/uipageviewcontroller-crashes-when-flipped-too- fast-in-low-memory – Signo

+0

Я проверил с вашей ссылкой ссылки, но все же у меня такая же проблема. – Brjv

ответ

1

Существует очень хорошее обсуждение здесь:

Removing a view controller from UIPageViewController

Принятая ответ обсуждает это:

" Не зная точно, почему это произошло pening, я отступил назад и в конце концов начал использовать ответ Jai в качестве решения, создав совершенно новый UIPageViewController, нажимая его на UINavigationController, а затем вытащил старый. Гросс, но он работает - в основном. Я находил я все еще получаю случайные утверждение Отказы от UIPageViewController, как это: отказ

  • Assertion в - [UIPageViewController queuingScrollView: didEndManualScroll: toRevealView: Направление: анимированные: didFinish: didComplete:], /SourceCache/UIKit_Sim/UIKit-2380.17/UIPageViewController.m:1820 $ 1 = 154507824 Нет вид контроллера управления видимым видом>

И сбой приложения. Зачем? Ну, в поисках, я нашел этот другой вопрос, о котором я упомянул, и, в частности, принятый ответ, который защищает мою оригинальную идею, просто позвонив setViewControllers: animated:YES, а затем, как только он завершит вызов setViewControllers: animated:NO с теми же контроллерами представления, чтобы сбросить UIPageViewController, но у него отсутствовал элемент: вызов этого кода в главной очереди! Вот код: «

+0

Можете ли вы отправить образец кода. – Brjv

+0

Я попытаюсь разработать пример этого вечера в США. Выключить, чтобы работать прямо сейчас. –

+0

Это решение для меня не работает :( – miljan

7

Это ошибка во внутренней реализации UIPageViewController в режиме прокрутки. Это происходит, когда анимация перехода происходит, когда контроллер просмотра страниц уже оживляет переход. Что я в итоге сделал, это заблокировать UI из нескольких быстрых прокруток. У меня есть две кнопки слева и справа, которые позволяют контроллеру просмотра страницы прокручиваться до предыдущего или следующего контроллера страницы. Я отключу работу кнопок, пока идет анимация. Делегат диспетчера просмотров страницы сообщает вам все, что вам нужно знать, когда нужно отключить функциональность пользовательского интерфейса и когда его снова включить, после того, как все анимации прекратились.

21

Итак, мое решение заключалось в добавлении BOOL, который отслеживает состояние моей анимации. ING новой ViewController, я изменить это тоже:

if (!_transitionInProgress) { 
      _transitionInProgress = YES; 
      [self.pageController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:^(BOOL finished) { 
       _transitionInProgress = !finished; 
      }]; 
     } 

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

+0

Это сработало для меня, я также разрешаю пользователю прокручивать представление для изменения пейджинга, поэтому я добавил такое же отслеживание состояния в методах 'UIPageViewControllerDelegate'' willTransitionToViewControllers' и ' didfinishAnimating', чтобы предотвратить совпадение кликов и проверок. – johnrechd

+0

Хороший улов !!!! –

2

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

У меня есть просмотр страницы, который позволяет пользователю прокручивать, а также просматривать прокрутки программно. Приложение иногда падает, когда вы просто вводите экран, но в следующих попытках он работает нормально, поэтому его вид сумасшедший. Даже если я установлю исправление, я не могу быть уверенным, что он работает, поскольку я не могу воспроизвести его. Похоже, что приведенный ниже код должен его исправить (взято с Removing a view controller from UIPageViewController), по крайней мере, экран лучше работает с этим кодом. Я был бы очень признателен, если бы мог получить какие-то методы, чтобы ввести эту ошибку самостоятельно, чтобы я мог проверить исправление.

- (void) setViewControllers:(NSArray*)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL))completion { 

    if (!animated) { 
     [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; 
     return; 
    } 

    [super setViewControllers:viewControllers direction:direction animated:YES completion:^(BOOL finished){ 

     if (finished) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       [super setViewControllers:viewControllers direction:direction animated:NO completion:completion]; 
      }); 
     } else { 
      if (completion != NULL) { 
       completion(finished); 
      } 
     } 
    }]; 
} 
+0

Был довольно последовательный краш (~ 80% времени) - пропал после добавления этого –

1

Я исправил проблему, установив edgesForExtendedLayout = UIRectEdgeNone на моем UIPageViewController подкласса:

- (instancetype)initWithTransitionStyle:(UIPageViewControllerTransitionStyle)style navigationOrientation:(UIPageViewControllerNavigationOrientation)navigationOrientation options:(NSDictionary<NSString *,id> *)options 
{ 
    self = [super initWithTransitionStyle:style navigationOrientation:navigationOrientation options:options]; 

    self.edgesForExtendedLayout = UIRectEdgeNone; 

    return self; 
} 
+1

не работал для меня – massimobio