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

M.A*_*ash 17 objective-c ios uipageviewcontroller swift

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

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

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

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

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

        return nextViewController
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢。我想知道,如何在 UIPageViewController 中保留 UI 状态?例如,在第二页中,它有滚动位置为X的UICollectionView。当我们滑回第二页时,如何恢复UICollectionView的X位置? (2认同)

小智 2

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