UIPageViewController no realiza un seguimiento del índice de la página

He estado luchando durante todo el fin de semana con este problema y he pasado mucho time buscando la solución sin éxito.

Mi caso de uso es bastante simple y no puedo creer lo difícil que es hacer que un comportamiento tan trivial funcione correctamente.

Mi aplicación es un simple flujo paginado donde los usuarios deslizan hacia la izquierda o hacia la derecha para ver la página siguiente o anterior. Tengo un UIPageViewController y cada página contiene una UITableView. He tenido problemas para tratar de mantener un logging del índice de páginas dentro de las funciones viewControllerAfterViewController y viewControllerBeforeViewController por los motivos que se explican aquí: Las funciones delegadas de PageViewController se invocan dos veces

He intentado seguir todas las soluciones sugeridas para este problema (haciendo un seguimiento del índice dentro de willTransitionToViewControllers y didFinishAnimating), pero esto no resuelve mi problema ya que las funciones viewController * ViewController todavía deben devolver un viewController y dado que inicialmente se llaman dos veces, el primer viewController devuelto parece ser el que se usa y el segundo paso no parece tener ningún efecto.

Aunque he visto muchas preguntas y blogs sobre este problema, no he visto un solo ejemplo que muestre cómo devolver constantemente el viewController correcto desde las funciones viewController * ViewController y sería enormemente agradecido por un ejemplo. El problema principal al que no veo una solución es cómo determinar el siguiente índice dentro de willTransitionToViewControllers si solo tengo un solo viewController cuyo contenido se actualiza dinámicamente en la carga de la página. Parece un problema de pollo y huevo para mí; Necesito averiguar qué contenido actualizar la página, pero para eso necesito saber cuál es el índice de la página (que forma parte del contenido).

Editar Aquí hay una versión destilada del código afectado:

- (void)viewDidLoad { [super viewDidLoad]; _pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; _pageViewController.dataSource = self; _pageViewController.delegate = self; [self.view addSubview:_pageViewController.view]; PageContentViewController *startingPage = [self viewControllerAtIndex:0]; NSArray *viewControllers = @[startingPage]; [_pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { // Don't do any index calculations as the result is inconsistent return [self viewControllerAtIndex:nextIndex]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { // Don't do any index calculations as the result is inconsistent return [self viewControllerAtIndex:nextIndex]; } - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { // This value never changes because the global _pageViewContentController hasn't been updated yet nextIndex = [((PageContentViewController *)pendingViewControllers[0]) pageIndex]; } - (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index { _pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; _pageContentViewController.pageIndex = index; _pageContentViewController.title = index; return _pageContentViewController; } 

He depurado el order en que se llaman estas funciones y esperaré que el _pageViewContentController global se llene con los datos correctos después de que la página haya realizado la transición.

Editar 2 Para dar más detalles sobre mi problema; Cada una de mis páginas contiene un título y una tabla de enlaces web. Al hacer clic en un enlace, se abre un WebViewController para mostrar la página web seleccionada. Con la solución de Yunus a continuación, todo se muestra correctamente (el título y los enlaces aparecen como se esperaba), pero el problema se presenta onclick en un enlace, ya que esto carga un enlace de la página siguiente. Parece que la fase de reproducción de la página ocurre en el punto en que los datos son correctos, pero luego reinicia el controller de contenido de la página con datos incorrectos después de que finaliza la renderización, razón por la cual los datos del enlace real son incorrectos (a pesar de que los datos procesados ​​son buenos )

Guardemos todos los ContentControllers relacionados en una matriz

 self.contentViewControllers = [NSMutableArray new]; for(int i=0; i< MAX_INDEX; i++) { [self.contentViewControllers addObject:[self viewControllerAtIndex:0]]; } 

Entonces, lo que tenemos que hacer es decidir qué controller de vista debemos mostrar después y antes de los methods.

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { for(int i=0;i<self.contentViewControllers.count ;i++) { if(viewController == [self.contentViewControllers objectAtIndex:i]) { if(i-1 >= 0) { return [self.contentViewControllers objectAtIndex:i-1]; } } } return nil; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { for(int i=0;i<self.contentViewControllers.count ;i++) { if(viewController == [self.contentViewControllers objectAtIndex:i]) { if(i+1 < self.contentViewControllers.count) { return [self.contentViewControllers objectAtIndex:i+1]; } } } return nil; } 

Luego en el método de transición

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { UIViewController* viewController = [pendingViewControllers objectAtIndex:0]; NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController]; [self.pageControl setCurrentPage:nextIndex]; }