42

我有一个UIPageViewController我正在提供页面数据以使用UIPageControllerDelegateand的实现UIPageControllerDataSource

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

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

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

我想我正在寻找类似于reloadData:on的东西UITableView

4

4 回答 4

94

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

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

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

通过这种解决方法,我避免了缓存错误,并且仍然可以animated:YESsetViewControllers:direction:animated:completion:.

于 2014-02-07T09:42:18.160 回答
31

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

此外,在 iOS 6 中,请注意您是否使用 UIPageViewControllerTransitionStyleScroll 样式,因为如果animated:为“是”,则会出现一个主要的缓存错误(请参阅我的讨论:UIPageViewController navigates to wrong page with Scroll tr​​ansition style)。

于 2013-03-10T18:31:23.413 回答
4

这是我在 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
    }
}
于 2016-08-04T20:57:10.967 回答
1

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
    }
}
于 2018-06-06T06:04:54.670 回答