【问题标题】:Refresh UIPageViewController - reorder pages and add new pages刷新 UIPageViewController - 重新排序页面并添加新页面
【发布时间】:2013-02-25 21:07:32
【问题描述】:

我有一个UIPageViewController,我正在为使用UIPageControllerDelegateUIPageControllerDataSource 的实现提供页面数据。

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

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

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

我想我在UITableView 上寻找类似于reloadData: 的东西。

【问题讨论】:

    标签: ios iphone cocoa-touch uikit uipageviewcontroller


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - setViewControllers:direction:animated:completion: 做到了。也为提到这个错误而欢呼。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 有趣。您在哪里取消设置和重置数据源?在setViewControllers:direction:animated:completion: 之前、之后还是在完成块中?谢谢。
    • 实际上,我在 dispatch_async 块中的 didFinish 后 0.01 秒执行此操作。
    • 谢谢!此方法在使用数据源时有效。接受的答案对我不起作用,至少在 iOS 8 上。将“setViewControllers:direction:animated:completion:”与当前视图控制器一起使用不会导致再次调用数据源。
    • 感谢此解决方案。 :-)
    • 这行不通,至少在 iOS 10.3 中不行。崩溃发生在 setViewControllers() 中,因此在 0.01 秒之后执行某些操作为时已晚。我在调用 setViewControllers() 之前尝试过这个技巧,但它不起作用。
    【解决方案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
        }
    }
    

    【讨论】:

    • 像魅力一样工作......完美......谢谢
    【解决方案4】:

    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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      相关资源
      最近更新 更多