我有一个UIPageViewController,其中包含从通过网络获取的数据实例化的视图控制器。当用户正在分页并进入最后几页时,我启动了一个新的网络操作,并将生成的新视图控制器放在我的UIPageViewControllerDataSource
可变数组视图控制器的末尾。总的来说这一切都很好。
但是如果网络速度很慢(或用户速度很快),则可以在网络操作完成之前到达最终页面。由于当用户到达最后一页时调用了pageViewController:viewControllerAfterViewController:,因此它已经返回nil
(“表示没有下一个视图控制器”)。
是否有一种强制UIPageViewController再次调用pageViewController:viewControllerAfterViewController:
的好方法(这样当网络操作完成并且现在有新页面时,我可以强制进行此调用,以便用户可以翻页到新页面) ?或者是否有解决方法(可能阻止用户分页到最后一页,但仍然显示反弹动画)?
答案 0 :(得分:5)
见这里:Refresh UIPageViewController - reorder pages and add new pages
当您从网络获取数据时,请致电setViewControllers: direction: animated: completion:
并再次将当前视图设置为当前视图。这迫使它重新调用pageViewController:viewControllerAfterViewController:
答案 1 :(得分:1)
ssloan的答案是密钥的一部分,但在我的情况下,简单地在网络操作完成块中调用setViewControllers:direction:animated:completion:
是不够的(由于一些边缘情况)。
我的解决方案是存储pageViewController:viewControllerAfterViewController:
返回nil
的最新视图控制器(我称之为endPage
)并创建方法...
- (void)fixAndResetEndPage {
if (self.endPage && self.endPage == self.currentPage) {
[self.pageController setViewControllers:@[self.currentPage] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
self.endPage = nil;
}
}
...每当我的NSMutableArray内容控制器发生变异(例如,网络操作完成)时我都会调用它,而pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
每当完成时YES
都会调用。