_UIQueuingScrollView引发无效的参数exception

我的包含UITableViewControllerembeddedUIPageViewController的应用程序不时引发这个exception:

Invalid parameter not satisfying: [views count] == 3 

回溯:

 * thread #1: tid = 0x6239fa, 0x03d1d88a libobjc.A.dylib`objc_exception_throw, queue = 'com.apple.main-thread, stop reason = breakpoint 25.3 frame #0: 0x03d1d88a libobjc.A.dylib`objc_exception_throw frame #1: 0x0404f448 CoreFoundation`+[NSException raise:format:arguments:] + 136 frame #2: 0x03428fee Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 frame #3: 0x01e7c535 UIKit`-[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:] + 185 frame #4: 0x01e800ca UIKit`-[_UIQueuingScrollView _didScrollWithAnimation:force:] + 1231 frame #5: 0x01e7bb57 UIKit`-[_UIQueuingScrollView _scrollViewAnimationEnded:finished:] + 104 frame #6: 0x0190583c UIKit`-[UIScrollView(UIScrollViewInternal) animator:stopAnimation:fraction:] + 62 frame #7: 0x0197096e UIKit`-[UIAnimator stopAnimation:] + 533 frame #8: 0x0197100a UIKit`-[UIAnimator(Static) _advanceAnimationsOfType:withTimestamp:] + 325 frame #9: 0x01970b76 UIKit`-[UIAnimator(Static) _LCDHeartbeatCallback:] + 67 frame #10: 0x01663b8a QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 48 frame #11: 0x01663a46 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 310 frame #12: 0x01663f6b QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 123 frame #13: 0x0400dbd6 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22 frame #14: 0x0400d5bd CoreFoundation`__CFRunLoopDoTimer + 1181 frame #15: 0x03ff5628 CoreFoundation`__CFRunLoopRun + 1816 frame #16: 0x03ff4ac3 CoreFoundation`CFRunLoopRunSpecific + 467 frame #17: 0x03ff48db CoreFoundation`CFRunLoopRunInMode + 123 frame #18: 0x0533b9e2 GraphicsServices`GSEventRunModal + 192 frame #19: 0x0533b809 GraphicsServices`GSEventRun + 104 frame #20: 0x01874d3b UIKit`UIApplicationMain + 1225 

有没有人已经看到这个或有一个想法可能是什么原因?

编辑:使用此修复程序更多的时间后,我仍然可以看到有时这个错误,所以这不是一个完整的解决scheme(嗯…它总是一种黑客)。 一旦我find它,我会更新实际的解决scheme。


我遇到了使用UIPageViewController同样的错误。 经过几个小时的debugging问题,我发现原因是在UIPageViewController的setViewControllers完成处理程序内使用UIViewanimation:方向:animation:完成:。

我不知道为什么animation在这个阶段导致断言错误(我没有animation的UIPageViewController或其子视图控制器),但包装在主队列dispatch_async代码块解决了这个问题,并停止崩溃。

我试图以编程方式转换到新页面时看到了这个崩溃。 对我来说有意义的答案是不允许他们在转换过程中触摸页面视图。

 __block UIView *pageView = pageViewController.view; // Disable page view to not allow the user to interrupt the page view animation and cause crash pageView.userInteractionEnabled = NO; [pageViewController setViewControllers:@[viewController] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL finished) { if (finished) { pageView.userInteractionEnabled = YES; // re-enable } }]; 

只要确保你没有在控制器的viewDidAppear中做任何animation,你将要返回。 或者,如果在视图出现之后必须延迟一段时间。

我遇到了与UIPageViewController中embedded的UIViewController相同的错误。 在我的情况下,我意识到我的孩子控制器已经覆盖viewWillAppearviewDidAppear没有调用super 。 虽然我只能猜测细节,但这样做可能会搞乱视图pipe理。 添加super电话使问题消失。

在我的情况下,问题是在实施UIPageViewControllerDelegate

我更新pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)约束pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)

主队列上的dispatch_async解决了这个问题

我使用带点的UIPageViewController。 用户在点上划动后,代理人做了FinishAnimating被调用,我触发其他animation,然后崩溃。 但只有当用户在点上划动时才会发生。

 - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed { if (completed && finished) { dispatch_async(dispatch_get_main_queue(), ^{ [self animateSomeView]; }) } }