我有一个UIPageViewController
,我提供了使用UIPageControllerDelegate
和UIPageControllerDataSource
实施的网页数据。
一切正常,但我希望能够在页面数据中添加项目并重新排序页面数据。
如果用户已经到达最后一个页面,然后我添加了一个项目,则他们无法访问下一页,因为已经调用了viewControllerAfterViewController:
。如果他们向后滚动一个然后向前滚动两个,他们可以很好地进入新页面,因此数据设置正确。如何告诉UIPageViewController
刷新下一步的内容?
同样,我想重新排序支持页面视图的集合。但如果我这样做,我会遇到同样的问题 - 页面视图会认为下一页仍然是上次加载当前页面时的内容。
我想我正在reloadData:
上寻找与UITableView
类似的内容。
答案 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
}
}