2013-03-09 170 views
5

我有一个UIPageViewController,其中包含从通过网络获取的数据实例化的视图控制器。当用户正在寻呼并在最后的几页之内时,我启动了一个新的网络操作,并将生成的新视图控制器放到我的UIPageViewControllerDataSource的可变视图控制器阵列的末尾。一般来说,这一切都很好。如何在用户到达最后一页后向UIPageViewController添加新页面?

但是,如果网络速度较慢(或用户速度较快),则有可能在网络操作完成之前到达最终页面。由于pageViewController:viewControllerAfterViewController:在用户到达最后一页时被调用,它已经返回nil(“表示没有下一个视图控制器”)。

有没有一种很好的方法来强制UIPageViewController再次调用pageViewController:viewControllerAfterViewController:(这样当网络操作完成并且现在有新页面时,我可以强制这个调用,以便用户可以翻页到新页面)?或者是有一种解决方法(可能阻止用户分页到最后一页,但仍显示反弹动画)?

+0

我有同样的问题 - 如果你找到一个方法,请你可以在这里发布你的解决方案。我也会这样做。谢谢 – ssloan 2013-03-10 18:00:39

回答

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

+0

根据我的经验,调用setViewControllers()并不能保证调用pageViewController:viewControllerAfterViewController。 – Lombas 2016-10-05 22:03:23

5

在这里看到:Refresh UIPageViewController - reorder pages and add new pages

当你得到你的数据从网络上回来,打电话setViewControllers: direction: animated: completion:,并重新设置当前视图到当前的一个。这迫使它重新呼叫pageViewController:viewControllerAfterViewController:

+0

它强制当前视图控制器重新加载。有没有重新加载当前页面的修复? – neobie 2016-02-13 09:21:41

相关问题