UIPageViewController中的断言失败

Brj*_*rjv 40 xcode ios uipageviewcontroller

虽然在UIPageViewController中切换选项卡太快,但App会崩溃

[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:]
Run Code Online (Sandbox Code Playgroud)

有错误断言失败和由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'没有视图控制器管理可见视图.

错误记录如下

*** 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
Run Code Online (Sandbox Code Playgroud)

提前致谢

And*_*lip 24

所以我的解决方案是添加一个BOOL跟踪我的动画状态.所以在设置新的之前ViewController,我也修改了它:

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

所以我会在设置新的视图控制器之前等待我的动画完成.在我的情况下,我有一些按钮,用户可以按下以切换页面.这也可以防止它们通过它们过快,因此动画总是流畅而美观


Leo*_*ica 10

这是滚动模式下UIPageViewController的内部实现中的错误.当页面视图控制器已经为转换设置动画时发生转换动画时会发生这种情况.我最终做的是阻止UI允许多个快速滚动.我有两个按钮,左右两个,使页面视图控制器滚动到上一页或下一页控制器.我会在动画进行时禁用按钮的操作.一旦所有动画停止,页面视图控制器的委托将告诉您何时需要知道何时禁用UI的功能以及何时重新启用它.


Ste*_*erg 1

这里有一个非常好的讨论:

从 UIPageViewController 中删除视图控制器

接受的答案讨论了这一点:

“由于不知道为什么会发生这种情况,我回溯并最终开始使用 Jai 的答案作为解决方案,创建一个全新的UIPageViewController,将其推送到UINavigationController,然后弹出旧的。恶心,但它基本上有效。我一直在发现我仍然偶尔会遇到断言失败的情况UIPageViewController,如下所示:

  • -[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:] 中断言失败,/SourceCache/UIKit_Sim/UIKit-2380.17/UIPageViewController.m:1820 $1 = 154507824 没有视图控制器管理可见视图>

并且应用程序崩溃了。为什么?好吧,搜索,我发现了我在上面提到的另一个问题,特别是公认的答案,它提倡我最初的想法,即简单地调用setViewControllers: animated:YES,然后在完成调用后立即setViewControllers: animated:NO使用相同的视图控制器来重置UIPageViewController,但它有缺少元素:将该代码调用回主队列!这是代码:”