Actualizar UIPageViewController: reordenar páginas y agregar nuevas páginas

Tengo un UIPageViewController que proporciono datos de página para usar una implementación de UIPageControllerDelegate y UIPageControllerDataSource .

Todo está funcionando bien, pero quiero poder agregar elementos a los datos de la página y reordenar los datos de la página.

Si un usuario ya ha llegado a la última de las páginas y luego agrego un elemento, no podrá acceder a la página siguiente porque viewControllerAfterViewController: ya se ha llamado. Si se desplazan hacia atrás uno y luego hacia adelante dos, pueden llegar a la nueva página correctamente, por lo que los datos están configurados correctamente. ¿Cómo puedo decirle al UIPageViewController que actualice su tienda de lo que viene después?

Del mismo modo, me gustaría reordenar la colección que respalda la vista de página. Pero si hago esto, tendré el mismo problema: la vista de la página pensará que la página siguiente sigue siendo la última vez que se cargó la página actual.

Supongo que estoy buscando algo similar a reloadData: en UITableView .

setViewControllers:direction:animated:completion: llamar a setViewControllers:direction:animated:completion:

Además, en iOS 6, ten cuidado si estás usando el estilo UIPageViewControllerTransitionStyleScroll, ya que hay un error importante en el almacenamiento en caché si está animated: es SÍ (mira mi discusión aquí: UIPageViewController navega a la página incorrecta con el estilo de transición de desplazamiento ).

Encontré una solución para forzar a UIPageViewController a olvidarse de los controladores de vista en caché de páginas vecinas que actualmente no se muestran:

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

Hago esto cada vez que cambio el conjunto de páginas. Por supuesto, esto no afecta la página que se muestra actualmente.

Con esta solución, evito el error de almacenamiento en caché y todavía puedo usar animated:YES en setViewControllers:direction:animated:completion:

Aquí está mi implementación completa de la respuesta de @ ortwin-gentz en el método de delegado didFinish en Swift 2, que funciona perfectamente para mí:

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

Versión de Swift 4 para volver a cargar los datos de pageviewcontroller, a la versión de @ theory.

 func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { if !completed { return } DispatchQueue.main.async() { self.dataSource = nil self.dataSource = self } }