8

我有一个UIPageViewController,其中包含从通过网络获取的数据实例化的视图控制器。当用户进行分页并在几页内结束时,我启动了一个新的网络操作并将生成的新视图控制器放在我UIPageViewControllerDataSource的可变视图控制器数组的末尾。一般来说,这一切都很好。

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

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

4

2 回答 2

6

请参见此处:刷新 UIPageViewController - 重新排序页面并添加新页面

当您从网络取回数据时,再次调用setViewControllers: direction: animated: completion:并将当前视图设置为当前视图。这迫使它重新调用pageViewController:viewControllerAfterViewController:

于 2013-03-10T19:39:29.123 回答
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.

于 2013-03-18T01:10:02.400 回答