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

ssl*_*oan 36 iphone cocoa-touch uikit ios uipageviewcontroller

我有一个UIPageViewController,我正在使用的实现提供网页数据UIPageControllerDelegateUIPageControllerDataSource.

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

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

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

我想我在寻找类似的东西reloadData:UITableView.

Ort*_*ntz 88

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

pageViewController.dataSource = nil;
pageViewController.dataSource = self;
Run Code Online (Sandbox Code Playgroud)

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

有了这个解决办法我避免缓存错误,仍然可以使用animated:YESsetViewControllers:direction:animated:completion:.

  • 谢谢!使用数据源时此方法有效.接受的答案对我不起作用,至少在iOS 8上.对当前视图控制器使用"setViewControllers:direction:animated:completion:"不会导致再次调用数据源. (4认同)
  • 有趣.你在哪里取消设置并重置dataSource?在`setViewControllers:direction:animated:completion:`之后,还是在完成块之前?谢谢. (3认同)

mat*_*att 30

你需要打电话setViewControllers:direction:animated:completion:.

此外,在iOS 6中,注意你是否使用UIPageViewControllerTransitionStyleScroll样式,因为如果animated:是YES 则存在一个主要的缓存错误(请参阅我的讨论:UIPageViewController导航到具有Scroll过渡样式的错误页面).

  • 谢谢 - setViewControllers:direction:animated:completion:做到了.也欢呼提到这个bug. (2认同)

Par*_*ion 5

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
    }
}
Run Code Online (Sandbox Code Playgroud)