我的应用程序包含嵌入 UIPageViewController 中的 UITableViewController 时不时引发此异常:
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
有人已经看到过这个或者知道原因是什么吗?
编辑:在使用此修复程序更多时间后,我仍然偶尔会看到该错误,因此这不是完整的修复程序(嗯......这总是一种黑客行为)。一旦找到实际的解决方案,我就会更新它。
我在使用 UIPageViewController 时遇到了同样的错误。经过几个小时的调试问题后,我发现原因是在 UIPageViewController 的 setViewControllers:direction:animated:completion: 的完成处理程序中使用了 UIView 动画。
我不知道为什么在那个阶段进行动画处理会导致断言错误(我没有对 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
}
}];
我将 UIPageViewController 与 Dots 一起使用。用户在点上滑动后,委托 didFinishAnimating 被调用,我触发其他动画,然后它崩溃。但只有当用户在点上滑动时才会发生。
- (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 中执行任何动画即可。或者,如果您必须在视图出现后延迟一段时间才能执行此操作。
就我而言,问题在于
UIPageViewControllerDelegate
的实施:
我更新了约束
pageViewController(_ pageViewController:, didFinishAnimating:, previousViewControllers:, transitionCompleted:)
dispatch_async
在主队列上解决这个问题
我在嵌入 UIPageViewController 中的 UIViewController 中遇到了同样的错误。 就我而言,我意识到我的子控制器已覆盖
viewWillAppear
和 viewDidAppear
而没有调用 super
。 虽然我只能猜测细节,但这样做可能会扰乱视图管理,这是有道理的。 添加 super
调用使问题消失。
这是 2024 年的解决方案:
如果您同时嵌套了 UIView 动画和 UIPageViewController 动画,就会发生这种情况。
UIPageViewController已经有动画状态;例如:
self.pageViewController.setViewControllers([nextViewController],
direction: .forward,
animated: true,
completion: nil)
您不需要将其覆盖在
UIView.animate
块内。如果你这样做;你会得到OP提到的崩溃。
我们通过保留 UIPageViewController 的动画并删除
UIView.animate
块成功摆脱了这个问题。