Ho bisogno di un modo per rendere UIPageViewController riusare i controller per risparmiare memoria, perché ho un numero enorme di pagine da mostrare! Ho eseguito l'implementazione di base di UIPageViewController ma non sono riuscito a rendere riutilizzabile il controller, per favore consiglio!come rendere UIPageViewController riutilizzare il controller come cella di riutilizzo di tableview?
come rendere UIPageViewController riutilizzare il controller come cella di riutilizzo di tableview?
risposta
È 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.
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
}
}
Questa è magia domanda :) e davvero bisogno di quella soluzione ... –