2015-07-02 8 views

risposta

1

È possibile utilizzare ACReuseQueue per ottenere ciò che si desidera. Fornisce una coda per riutilizzare i tuoi controller di visualizzazione. È possibile utilizzare i metodi dell'origine dati UIPageViewController per deselezionare un VC dalla coda di riutilizzo. La parte difficile è sapere quando rimetterli nella coda di riutilizzo. UIPageViewController non fornisce alcun metodo per sapere quando ciò accade, ma c'è un modo. UIPageViewController è un contenitore VC che aggiunge e rimuove i suoi controller di visualizzazione figlio utilizzando le API di contenimento VC. Il VC riceverà didMoveToParentViewController: con nil come argomento se viene rimosso da UIPageViewController. Utilizzare questo metodo per aggiungersi alla coda.

7

Per risolvere questo problema nel mio progetto corrente, memorizzo nella cache tutti i controller di visualizzazione creati come pagine per UIPageViewController in un Set. Ogni volta che il UIPageViewController richiede un nuovo View Controller dalla sorgente dati, ho filtrare un inutilizzato da quella cache controllando la proprietà parentViewController; se nessun controller di vista inutilizzata è disponibile, viene creato uno nuovo.

La mia configurazione del UIPageViewController e la cache è simile a questo:

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 
    } 
    } 
} 

L'origine dati utilizza la stessa funzione per ottenere una vista di controllo inutilizzato:

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

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

     return nextViewController 
    } 
}