Fonctions de délégué PageViewController appelées deux fois

Je travaille avec UIPageViewController, pour faire un tour du produit pour mon application.

J'ai suivi ce lien http://www.appcoda.com/uipageviewcontroller-tutorial-intro/

Je fais est simple tâche de changer la couleur backgound de mon "VC racine" sur le balayage, basé sur la valeur d'index que je reçois, mais comme les fonctions déléguées sont appelées deux fois, ma valeur d'index est incorrecte et à cause de cela, je ne suis pas capable de bien faire, ci-dessous est mon code

#import "APPViewController.h" #import "APPChildViewController.h" @interface APPViewController () @end @implementation APPViewController - (void)viewDidLoad { [super viewDidLoad]; self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; self.pageController.dataSource = self; [[self.pageController view] setFrame:CGRectMake(0, 0, 320, 500)]; APPChildViewController *initialViewController = [self viewControllerAtIndex:0]; NSArray *viewControllers = [NSArray arrayWithObject:initialViewController]; [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; [self addChildViewController:self.pageController]; [[self view] addSubview:[self.pageController view]]; [self.pageController didMoveToParentViewController:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (APPChildViewController *)viewControllerAtIndex:(NSUInteger)index { APPChildViewController *childViewController = [[APPChildViewController alloc] initWithNibName:@"APPChildViewController" bundle:nil]; childViewController.index = index; childViewController.view.backgroundColor = [UIColor clearColor]; if(index == 0) { self.view.backgroundColor = [UIColor redColor]; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } return childViewController; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; if (index == 0) { return nil; } // Decrease the index by 1 to return index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; index++; if (index == 3) { return nil; } return [self viewControllerAtIndex:index]; } - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { // The number of items reflected in the page indicator. return 3; } - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { // The selected item reflected in the page indicator. return 0; } 

S'il vous plaît aidez-moi, je ne vais pas où je vais mal

Cordialement Ranjit

Après avoir beaucoup cherché.

Je reçois cela:

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController; - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController; 

2 fonctions utilisent pour get pageViewController derrière ou en face de pageViewController en cours.

Je pense qu'il est difficile d'get pageViewController

Ma suggestion:

Dans UIPageViewControllerDelegate, il a une fonction:

  - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers; 

Cette fonction vous donne un tableau pendingViewControllers et c'est le tableau pageViewController actuel. Donc, vous pouvez mettre en œuvre comme ça:

 - (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { if([pendingViewControllers count]>0) { NSUInteger index =[(APPChildViewController*)[pendingViewControllers objectAtIndex:0] index]; if(index == 0) { self.view.backgroundColor = [UIColor redColor]; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } } } 

Dans viewDidLoad, vous ajoutez:

  self.pageController.delegate = self; self.view.backgroundColor = [UIColor redColor]; //set first background. 

Dans 'APPViewController.h', vous devez append:

 @interface APPViewController : UIViewController<UIPageViewControllerDataSource,UIPageViewControllerDelegate> 

Rappelez-vous: supprimez ce code (dans la fonction 'viewControllerAtIndex')

 if(index == 1) { self.view.backgroundColor = [UIColor redColor]; } if(index == 2) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 3) { self.view.backgroundColor = [UIColor greenColor]; } 

Faites-moi savoir si vous avez des questions.

Remplacez ces deux methods et comstackz,

 - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; if (index == 0) { self. view.backgroundColor = [UIColor redColor]; return nil; } if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } if(index == 3) { self.view.backgroundColor = [UIColor brownColor]; } /*if(index == 4) { self.view.backgroundColor = [UIColor whiteColor]; }*/ // Decrease the index by 1 to return index--; return [self viewControllerAtIndex:index]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { NSUInteger index = [(APPChildViewController *)viewController index]; /*if(index == 0) { self.view.backgroundColor = [UIColor redColor]; }*/ if(index == 1) { self.view.backgroundColor = [UIColor blueColor]; } if(index == 2) { self.view.backgroundColor = [UIColor greenColor]; } if(index == 3) { self.view.backgroundColor = [UIColor brownColor]; } if(index == 4) { self.view.backgroundColor = [UIColor whiteColor]; return nil; } /*if (index == 5) { return nil; }*/ index++; return [self viewControllerAtIndex:index]; } 

et ajoutez ceci à la fin de - (void)viewDidLoad {

self.view.backgroundColor = [UIColor redColor];

J'ai fait face au même problème et j'ai finalement compris la cause. Les methods de délégué sont appelées deux fois lorsque le style de transition pour le controller de page est défini sur "Page Curl".

Lorsque le style de transition est défini sur "Page Curl", l'action est similaire à la rotation d'une page dans un livre. Vous tournez une page et le numéro de page est incrémenté de 2. Appliquant le même concept pour le controller de vue de page, 2 controllers de vue sont transférés pour le style Page Curl: l'un est le controller de vue et l'autre est de l'autre côté de la vue recourbée.

Changer le style de transition à "Scroll" et vous pouvez vous débarrasser du problème

Cela peut être fait à partir du storyboard dans l'inspecteur d'attributes comme suit: check image

Vous pouvez également modifier la même chose par le code en définissant la propriété UIPageViewController.transitionStyle sur UIPageViewControllerTransitionStyleScroll.

J'espère que cela aide