2013-03-10 16 views
28

Ho un UIPageViewController che sto fornendo dati di pagina per l'utilizzo di un'implementazione di UIPageControllerDelegate e UIPageControllerDataSource.Aggiorna UIPageViewController - riordina le pagine e aggiungi nuove pagine

Funziona tutto bene, ma voglio essere in grado di aggiungere elementi ai dati della pagina e riordinare i dati della pagina.

Se un utente ha già raggiunto l'ultima delle pagine e quindi aggiungo un elemento, non è possibile accedere alla pagina successiva perché è stato già chiamato viewControllerAfterViewController:. Se si scorre indietro di uno e poi in avanti di due, possono accedere alla nuova pagina, quindi i dati sono impostati correttamente. Come posso dire allo UIPageViewController di aggiornare il suo archivio di ciò che viene dopo?

Analogamente, desidero riordinare la raccolta che supporta la vista della pagina. Ma se lo faccio, avrò lo stesso problema: la visualizzazione della pagina penserà che la pagina successiva sia ancora l'ultima volta che è stata caricata la pagina corrente.

Suppongo che sto cercando qualcosa di simile a reloadData: su UITableView.

risposta

23

È necessario chiamare setViewControllers:direction:animated:completion:.

Inoltre, in iOS 6, attenzione se si sta utilizzando lo stile UIPageViewControllerTransitionStyleScroll, in quanto v'è un bug importante caching se animated: è sì (vedi la mia discussione qui: UIPageViewController navigates to wrong page with Scroll transition style).

+2

Grazie - le setViewControllers: direzione: animato: esecuzione: lo ha fatto. Saluti anche per aver menzionato il bug. – ssloan

76

ho trovato una soluzione per costringere UIPageViewController dimenticare view controller cache delle pagine confinanti che non sono attualmente visualizzate:

pageViewController.dataSource = nil; 
pageViewController.dataSource = self; 

faccio questo ogni volta che cambia l'insieme di pagine. Ovviamente questo non influisce sulla pagina attualmente visualizzata.

Con questa soluzione, evito il bug della cache e posso ancora utilizzare animated:YES in setViewControllers:direction:animated:completion:.

+3

Interessante. Dove disinserisci e reimpostare il data source? Prima di 'setViewControllers: direction: animated: completion:', dopo di esso, o nel blocco di completamento? Grazie. – ernesto

+0

In realtà, faccio questo 0.01 secondi dopo ha fatto Fine in un blocco dispatch_async. –

+1

Sembra funzionare alla grande, grazie per il tuo feedback! – ernesto

1

Ecco la mia completa implementazione della risposta di @ Ortwin-Gentz ​​nel metodo didFinish delegato in Swift 2, che funziona perfettamente per me:

func pageViewController(
    pageViewController: UIPageViewController, 
    didFinishAnimating finished: Bool, 
    previousViewControllers: [UIViewController], 
    transitionCompleted completed: Bool 
) { 
    if !completed { return } 
    dispatch_async(dispatch_get_main_queue()) { 
     pageViewController.dataSource = nil 
     pageViewController.dataSource = self 
    } 
} 
Problemi correlati