刷新UIPageViewController - 重新排序页面并添加新页面

时间:2013-03-10 18:28:19

标签: ios iphone cocoa-touch uikit uipageviewcontroller

我有一个UIPageViewController,我提供了使用UIPageControllerDelegateUIPageControllerDataSource实施的网页数据。

一切正常,但我希望能够在页面数据中添加项目并重新排序页面数据。

如果用户已经到达最后一个页面,然后我添加了一个项目,则他们无法访问下一页,因为已经调用了viewControllerAfterViewController:。如果他们向后滚动一个然后向前滚动两个,他们可以很好地进入新页面,因此数据设置正确。如何告诉UIPageViewController刷新下一步的内容?

同样,我想重新排序支持页面视图的集合。但如果我这样做,我会遇到同样的问题 - 页面视图会认为下一页仍然是上次加载当前页面时的内容。

我想我正在reloadData:上寻找与UITableView类似的内容。

4 个答案:

答案 0 :(得分:85)

我找到了一种解决方法,强制UIPageViewController忘记当前未显示的相邻网页的缓存视图控制器:

pageViewController.dataSource = nil;
pageViewController.dataSource = self;

每次更改页面集时都会这样做。当然这不会影响当前显示的页面。

通过此解决方法,我避免了缓存错误,仍然可以在animated:YES中使用setViewControllers:direction:animated:completion:

答案 1 :(得分:27)

您需要致电setViewControllers:direction:animated:completion:

此外,在iOS 6中,请注意您是否使用UIPageViewControllerTransitionStyleScroll样式,因为如果animated:为YES,则存在重大缓存错误(请参阅我在此处的讨论:UIPageViewController navigates to wrong page with Scroll transition style)。

答案 2 :(得分:3)

这是我在Swift 2中的didFinish委托方法中完全实现@ ortwin-gentz的答案,这对我来说非常有用:

func pageViewController(
    pageViewController: UIPageViewController,
    didFinishAnimating finished: Bool,
    previousViewControllers: [UIViewController],
    transitionCompleted completed: Bool
) {
    if !completed { return }
    dispatch_async(dispatch_get_main_queue()) {
        pageViewController.dataSource = nil
        pageViewController.dataSource = self
    }
}

答案 3 :(得分:0)

Swift 4版本,用于将pageviewcontroller的数据重新加载到@ theory的版本。

func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
    if !completed { return }
    DispatchQueue.main.async() {
        self.dataSource = nil
        self.dataSource = self
    }
}