Come posso aggiungere nuove pagine ad un UIPageViewController dopo che l'utente ha raggiunto l'ultima pagina?

Ho un UIPageViewController che contiene controller di visualizzazione che vengono istanziati dai dati recuperati attraverso la networking. Quando l'utente esegue il paging e rientra in poche pagine della fine, avvio una nuova operazione di networking e inserisco i nuovi controller di visualizzazione risultanti nella parte finale della mia matrix mutabile di controller di visualizzazione di UIPageViewControllerDataSource . In generale, tutto funziona abbastanza bene.

Ma se la networking è lenta (o l'utente è veloce), è ansible raggiungere la pagina finale prima che l'operazione di networking sia completata. Poiché pageViewController: viewControllerAfterViewController: viene chiamato quando l'utente raggiunge l'ultima pagina, ha già restituito nil ("per indicare che non esiste un controller successivo").

C'è un buon modo per forzare UIPageViewController a call pageViewController:viewControllerAfterViewController: nuovo (in modo che quando l'operazione di networking è completa e ora ci siano nuove pagine, posso forzare questa chiamata in modo che l'utente possa accedere alle nuove pagine)? O c'è una soluzione alternativa (forse impedisce all'utente di impaginare l'ultima pagina, ma mostra ancora l'animation di rimbalzo)?

Solutions Collecting From Web of "Come posso aggiungere nuove pagine ad un UIPageViewController dopo che l'utente ha raggiunto l'ultima pagina?"

Vedi qui: Aggiorna UIPageViewController – riordina le pagine e aggiungi nuove pagine

Quando si recuperano i dati dalla networking, call setViewControllers: direction: animated: completion: e impostare nuovamente la vista corrente su quella corrente. Ciò lo costringe a ricall pageViewController:viewControllerAfterViewController:

La risposta di ssloan era parte della chiave, ma nel mio caso semplicemente chiamando setViewControllers:direction:animated:completion: nel block di completamento dell'operazione di networking non era abbastanza (a causa di alcuni casi limite).

La mia soluzione era di memorizzare il controller di visualizzazione più recente per cui pageViewController:viewControllerAfterViewController: restituito nil (l'ho chiamato endPage ) e per creare un metodo …

 - (void)fixAndResetEndPage { if (self.endPage && self.endPage == self.currentPage) { [self.pageController setViewControllers:@[self.currentPage] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.endPage = nil; } } 

… che ho chiamato each qualvolta il mio NSMutableArray dei controller dei contenuti è stato mutato (ad esempio, il completamento delle operazioni di networking) e in pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted: each volta che è stato completato era YES .