我需要一种方法来使UIPageViewController重用控制器以节省内存,因为我有大量的页面要显示! 我做了UIPageViewController的基本实现,但无法设法使控制器可重用,请咨询!
答案 0 :(得分:11)
为了解决当前项目中的这个问题,我将所有视图控制器缓存为UIPageViewController
中Set
的页面。每当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作为参数。使用此方法将您自己添加回队列。