如何使UIPageViewController重用像tableview重用单元格的控制器?

时间:2015-07-02 10:41:22

标签: ios objective-c swift uipageviewcontroller

我需要一种方法来使UIPageViewController重用控制器以节省内存,因为我有大量的页面要显示! 我做了UIPageViewController的基本实现,但无法设法使控制器可重用,请咨询!

2 个答案:

答案 0 :(得分:11)

为了解决当前项目中的这个问题,我将所有视图控制器缓存为UIPageViewControllerSet的页面。每当UIPageViewController从其数据源请求新的视图控制器时,我通过检查parentViewController属性从该缓存中过滤掉未使用的;如果没有未使用的视图控制器,则创建一个新的视图控制器。

我对UIPageViewController和缓存的设置与此类似:

class MyPageViewController: UIPageViewController {
    private var reusableViewControllers = Set<MyViewController>()
    init() {
      super.init(/* ... */)
      self.dataSource = self

      let initialViewController = self.unusedViewController()

      // Configure the initial view controller
      // ...

      self.setViewControllers([ initialViewController ], 
                              direction: .Forward, 
                              animated: false, 
                              completion: nil)
    }

  // This function returns an unused view controller from the cache
  // or creates and returns a new one
  private func unusedViewController() -> MyViewController {
    let unusedViewControllers = reusableViewControllers.filter { $0.parentViewController == nil }
    if let someUnusedViewController = unusedViewControllers.last {
        return someUnusedViewController
    } else {
        let newViewController = MyViewController()
        reusableViewControllers.insert(newViewController)
        return newViewController
    } 
  }
}

数据源使用相同的函数来获取未使用的视图控制器:

extension MyPageViewController: UIPageViewControllerDataSource {
  func pageViewController(pageViewController: UIPageViewController,
                          viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        let nextViewController = unusedViewController()

        // Configure the next view controller for display
        // ...

        return nextViewController
    }
}

答案 1 :(得分:2)

您可以使用ACReuseQueue来达到您想要的效果。它提供了重用视图控制器的队列。您可以使用UIPageViewController数据源方法将VC从重用队列中出列。棘手的部分是知道何时将它们放回重用队列中。 UIPageViewController没有提供任何方法来知道这种情况何时发生,但有一种方法。 UIPageViewController是一个容器VC,它使用VC包含API添加和删除其子视图控制器。 您的VC将收到didMoveToParentViewController:如果从UIPageViewController中删除它,则将nil作为参数。使用此方法将您自己添加回队列。