我需要一种方法使UIPageViewController可以重用控制器来节省内存,因为我有大量页面要展示! 我已经实现了UIPageViewController的基本功能,但无法将控制器重用,请给予建议!
我需要一种方法使UIPageViewController可以重用控制器来节省内存,因为我有大量页面要展示! 我已经实现了UIPageViewController的基本功能,但无法将控制器重用,请给予建议!
为了解决我当前项目中的这个问题,我将作为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
}
}
if let someUnusedViewController = reuseableViewControllers.first(where: { $0.parentViewController == nil }) {
这个代码,它可能会稍微更有效率一些。我正在使用数组而非集合。我发现在iOS 12.1上,该代码只构建三个视图控制器。 - PhoneyDeveloperviewController
向下转型为具有index
属性的自定义UIViewController
子类。你的第二个问题太广泛了,无法在评论中回答。你可能需要先阅读UIPageViewController
和UICollectionView
的文档,然后如果仍有不清楚的地方,请发布一个新的、更具体的问题。 - Theo