Invalid parameter exception thrown by _UIQueuingScrollView
我的包含在UIPageViewController中嵌入的UITableViewController的应用有时会引发此异常:
1 | Invalid parameter not satisfying: [views count] == 3 |
回溯:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * 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 |
有人看过这个吗?或者知道原因可能是什么吗?
编辑:在使用了此修复程序更多的时间之后,我仍然偶尔可以看到该错误,因此这并不是完整的修复程序(嗯……这总是一种hack)。找到后,我将使用实际的解决方案进行更新。
我在使用UIPageViewController时遇到了同样的错误。经过数小时的调试后,我发现原因是在UIPageViewController的setViewControllers:direction:animated:completion:.. pb的完成处理程序中使用了UIView动画。
我不知道为什么在该阶段进行动画处理会导致断言错误(我不是在对UIPageViewController或其子视图控制器进行动画处理),但是在主队列上用dispatch_asyncpackage代码块可以解决此问题并避免崩溃。
当我尝试以编程方式过渡到新页面时,看到此崩溃。对我来说有意义的答案是,在过渡期间,不允许他们触摸页面视图。
1 2 3 4 5 6 7 8 9 10 | __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 } }]; |
我使用带点的UIPageViewController。用户在圆点上滑动后,将调用委托didFinishAnimating,然后触发其他动画,然后崩溃。但是只有在用户在圆点上滑动时才会发生。
1 2 3 4 5 6 7 8 9 | - (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]; }) } } |
只需确保您没有在要返回的控制器的viewDidAppear中进行任何动画处理。或者,如果视图出现后必须延迟一段时间后再执行此操作。
在我的情况下,问题出在
我在更新约束
主队列上的
我在UIPageViewController中嵌入的UIViewController遇到了相同的错误。就我而言,我意识到我的子控制器已经覆盖了