2013-07-12 12 views
12

Sto lavorando con UIPageViewController, per creare un tour del prodotto per la mia applicazione.PageViewController funzioni delegate chiamate due volte

ho seguito questo link http://www.appcoda.com/uipageviewcontroller-tutorial-intro/

che sto facendo è semplice compito di cambiare colore sfondo della mia "VC root" sul colpo, in base al valore dell'indice che ricevo, ma come le funzioni delegate sono chiamati due volte , il mio valore dell'indice non è corretto e per questo, io non sono in grado di farlo bene, al di sotto è il mio codice

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

si prega di darmi una mano, io non sto dove sto andando male

Saluti Ranjit

+0

cosa esattamente si vuole un controllo pagina con UIViews o UIViewControllers –

+0

@ VivekSehrawat, le funzioni delegate di UIPageViewController funzionano solo con VC. Quindi devo dirci VC – Ranjit

+0

Vuoi cambiare il colore di sfondo di APPChildViewController o APPViewController? –

risposta

10

Dopo aver cercato per un sacco.

ricevo che:

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

2 funzioni utilizzano per ottenere pageViewController dietro o davanti pageViewController corrente.

io pensa che sia difficile ottenere pageViewController corrente

Il mio suggerimento:

In UIPageViewControllerDelegate, che hanno una funzione:

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

Questa funzione di dare una matrice pendingViewControllers e questo è pageViewController corrente array. Così si può implementare così:

- (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]; 
    } 


    } 
} 

In viewDidLoad, si aggiunge:

self.pageController.delegate = self; 

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

In 'APPViewController.h' Sei sicuro aggiungere:

@interface APPViewController : UIViewController<UIPageViewControllerDataSource,UIPageViewControllerDelegate> 

Ricorda: rimuovere questo codice (nella funzione '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]; 
} 

Fatemi sapere se avete domande.

+0

la funzione delegato non viene chiamata – Ranjit

+0

aggiungi? : self.pageController.delegate = self; –

+0

scusate, l'ho dimenticato – Ranjit

1

Sostituire questi due metodi e compilare,

- (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]; 

} 

e aggiungere questo alla fine del - (void)viewDidLoad {

self.view.backgroundColor = [UIColor redColor];

+0

Non funziona ancora – Ranjit

+0

ancora non funziona ???? –

+0

Sì, non funziona ancora – Ranjit

1

Ho affrontato lo stesso problema e alla fine ho capito la causa. I metodi delegati vengono richiamati due volte quando lo stile di transizione per il controller della visualizzazione di pagina è impostato su "Pagina arricciata".

Quando lo stile di transizione è impostato su "Pagina arricciata", l'azione è come trasformare una pagina in un libro. Giri una pagina e il numero della pagina aumenta di 2. Applicando lo stesso concetto per il controller di visualizzazione di pagina, i controller di vista a 2 vengono trasferiti per lo stile di arricciatura pagina: uno è il controller di visualizzazione che si vede e l'altro controller di vista si trova sull'altro lato della vista arricciata.

cambiare lo stile di transizione a "scorrimento" e si può sbarazzarsi del problema

Questo può essere fatto da storyboard nella finestra di ispezione attributo come segue: check image

si può anche cambiare lo stesso per codice impostando la proprietà UIPageViewController.transitionStyle su UIPageViewControllerTransitionStyleScroll.

Speranza che aiuta

Problemi correlati