2015-07-02 3 views
9

Мне нужен способ, чтобы контроллеры повторного использования UIPageViewController сохраняли память, потому что у меня есть огромное количество страниц для показа! Я выполнил основную реализацию UIPageViewController, но не смог заставить контроллер повторно использовать, пожалуйста, совет!Как сделать контроллер повторного использования UIPageViewController таким же, как ячейка повторного использования tableview?

+0

Это волшебный вопрос :) и действительно нужно это решение ... –

ответ

1

Вы можете использовать ACReuseQueue для достижения желаемого. Он предоставляет очередь для повторного использования ваших контроллеров представлений. Вы можете использовать методы источника данных UIPageViewController для удаления очереди VC из очереди повторного использования. Трудная часть состоит в том, чтобы знать, когда вернуть их в очередь повторного использования. UIPageViewController не предоставляет никакого способа узнать, когда это произойдет, но есть способ. UIPageViewController является контейнером VC, который добавляет и удаляет свои дочерние контроллеры представлений с использованием API-интерфейсов VC. Ваш VC получит didMoveToParentViewController: с нулем в качестве аргумента, если он удаляется из UIPageViewController. Используйте этот метод, чтобы добавить себя в очередь.

7

Чтобы решить эту проблему в моем текущем проекте, я кэширую все контроллеры представлений, созданные в качестве страниц для 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 
    } 
}