在我正在开发的iOS 11应用程序中(使用Swift 4),我需要动态地将页面添加到UIPageViewController。但是,在某些情况下,我会收到以下崩溃错误(NSInternalInconsistencyException):

2017-11-27 14:55:54.787260+0000 MyApp[380:79434] *** Assertion failure in -[UIPageViewController _flushViewController:animated:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.21.8/UIPageViewController.m:2124
2017-11-27 14:55:54.791022+0000 MyApp[380:79434] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Don't know about flushed view <UIView: 0x12dd48ac0; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x1c003c280>>'

我对iOS的开发还很陌生,所以如果答案很明显的话,我很抱歉,但是我很难找到导致崩溃的根本原因。记录的消息也不是很有帮助。。。
这是我用来添加页面的代码:
//Inflate the view controller
let viewController = newViewController(param: someParam )

//Add it to the view controllers pool
viewControllersOrdered.insert(viewController, at: getInsertionIndex(param: someOtherParam) )

//Add it to the pageViewController
pageViewController.setViewControllers([viewController], direction: .forward, animated: false, completion: nil)

//Force cache to be cleared
pageViewController.dataSource = nil;
pageViewController.dataSource = self;

getInsertionIndex函数工作正常,这不是崩溃的根源。

最佳答案

在我正在开发的iOS 11应用程序中(使用Swift 4),我需要动态地将页面添加到UIPageViewController。
听起来你的意思是:在用户真正尝试“翻页”之前,你不知道下一个/上一个视图控制器是什么。在这种情况下,滚动的UIPageViewController不适合您的体系结构(因为,正如您已经了解到的,它预先准备了下一页和上一页)。你有两个选择:
使用页面卷曲UIPageViewController。它不会预先缓存页面,因此在用户真正要求翻页之前,不会要求您做出决定。
完全不使用UIPageViewController;使用分页水平滚动视图并自己管理内容视图。
此外,如果您使用的是UIPageViewController,则在任何情况下都不应保留子视图控制器的保留列表。这是UIPageViewController的工作。您的工作只是提供下一个或上一个视图控制器,您应该根据需要而不是在其他时间创建该控制器,并将其释放到UIPageViewController的唯一控件中。

关于ios - 添加页面时,UIPageViewController崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47514111/

10-13 04:29