2013-04-24 3 views
5

Desidero tenere traccia dell'indice utilizzando UIPageViewController. Ogni volta che faccio scorrere ho bisogno di index++ o index--. Questo metodo delegato viene chiamato ogni volta che si scorrere indietro o ulteriori:Controllo UIPageViewController quando si scorre indietro o in avanti

- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed 
{ 
    // If the page did not turn 
    if (!completed) 
    { 
     // You do nothing because whatever page you thought 
     // the book was on before the gesture started is still the correct page 
     return; 
    } 

    // I want to check here whenever the page was swiped back or further 
} 

Come posso controllare in questo metodo se l'utente fregato di nuovo o di più? So che ci sono i 2 metodi DataSource "viewControllerAfterViewController" e "viewControllerBeforeViewController" ma non riesco a controllare se la transizione della pagina è stata completata (e posso farlo nel metodo sopra) qualsiasi idea su come potrei sapere se l'utente ha fatto il back o successivo il metodo sopra?

risposta

3

In base allo documentation non sembra essere un modo per dire se l'utente ha fatto scorrere la pagina in avanti o all'indietro. Il booleano 'finito' ti dirà se l'utente ha completato o meno il turno di pagina.

Una soluzione:

Creare un int variabile e utilizzando i metodi viewControllerAfterViewController e viewControllerBeforeViewController aumentare o diminuire il valore della variabile. Usalo per verificare se sono andati avanti o indietro.

Edit: Si potrebbe utilizzare presentationIndexForPageViewController dal documentation

Edit 2: Controllare questo link here C'è un metodo denominato setViewControllers:direction:animated:completion: la direzione sarà o UIPageViewControllerNavigationDirectionForward o UIPageViewControllerNavigationDirectionReverse

Edit 3: Codice - Ciò presuppone si sa che view Controller verrà chiamato da o andare avanti o indietro:

creare una variabile sul AppDelegate e un metodo setter:

int indexVar; 

- (void)setIndex:(int)indexVar; 

Poi sui controller di vista (avanti o indietro) o aumentare il valore o diminuire il valore (viewDidLoad):

(AppDelegate *)[[UIApplication sharedApplication] delegate] setIndex:<whatever>]; 

qualcosa del genere. Questo non sarà un modo esatto per raggiungere il tuo obiettivo, ma spero che ti porti nella giusta direzione.

+0

Il problema è che non riesco a tenere traccia dell'indice in queste 2 funzioni ... Perché non riesco a controllare se la transizione è stata completata, se non è stata completata l'indice non ha bisogno di aumentare o diminuisci (ea se prendi la pagina ma non la accendi alla pagina successiva) – nonuma

+1

Ho modificato la mia risposta per riflettere i tuoi commenti. PresentationIndex non cambierà in su o in giù a meno che l'utente non sia andato avanti o indietro. – Jordan

+0

E come si usa quel metodo? Puoi darmi un piccolo esempio di come indicizzo ++ e index--? – nonuma

4

uso del protocollo:

MyClass : UIViewController <UIPageViewControllerDataSource,UIPageViewControllerDelegate 

dichiarare un atributes:

@property(nonatomic) NSInteger currentIndex; 
@property(nonatomic) NSInteger nextIndex; 

e nei metodi:

-(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{ 
    NewsTableViewController *controller = [pendingViewControllers firstObject]; 
    self.nextIndex = [self.arrViews indexOfObject:controller]; 
} 

-(void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{ 
    if (completed) { 
     self.currentIndex = self.nextIndex; 
    } 
    self.nextIndex = 0; 
} 

questo punto si avrà la pagina corrente. Grazie a Corey Floyd in enter link description here

+0

'nextIndex' dovrebbe essere uguale a' currentIndex + 1'. In 'didFinishAnimating', controlla il nuovo' currentIndex == nextIndex', lo fai scorrere a sinistra, altrimenti è giusto – huync

+0

in questo modo funziona bene! –

0

L'ho fatto creando protocolli in ciascuna delle mie classi ViewController, con il metodo di protocollo chiamato nel metodo viewWillAppear. Quindi in PageViewController ogni volta che istanzio uno dei controller della vista imposto il suo delegato come PageViewController. Questo è il 3 ° ViewController nel mio progetto (Si noti che ho fatto questo in ciascuno dei miei controller di vista)

@class ViewController3; 
@protocol ViewControllerPageNumber <NSObject> 

-(void)viewWillAppearMyPageNumber:(int)myPageNumber; 

@end 
@interface ViewController3 : UIViewController 
@property (nonatomic, weak) id <ViewControllerPageNumber> delegate; 
@end 

e nel file .m nel metodo viewWillAppear

-(void)viewWillAppear:(BOOL)animated{ 
    [self.delegate viewWillAppearMyPageNumber:3];//The 3 will be different for each ViewController 
} 

Avanti, in PageViewController.m, ogni volta che istanzia un controller di visualizzazione, imposto il suo delegato come auto (o PageViewController). viewCons è solo una serie di stringhe con i miei nomi viewControllers.

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index { 
    id vc = [[NSClassFromString([viewCons objectAtIndex:index]) alloc] init]; 
    if([vc isMemberOfClass:[NSClassFromString(@"ViewController3") class]]){ 
     ViewController3 *vc3=(ViewController3 *) vc; 
     vc3.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController2") class]]){ 
     ViewController2 *vc2=(ViewController2 *) vc; 
     vc2.delegate=self; 
    }else if([vc isMemberOfClass:[NSClassFromString(@"ViewController") class]]){ 
     ViewController *vc1=(ViewController *) vc; 
     vc1.delegate=self; 
    } 
    return vc; 
} 

Infine, sto implementando il mio metodo delegato personalizzato, che nel mio caso è il testo etichette rinfrescanti ho posto sulla parte superiore del PageViewController.

0

Penso che la soluzione più semplice sia quella di creare una propria classe ViewController con una proprietà che tenga traccia dell'indice attualmente visualizzato. Nella maggior parte dei casi ho comunque bisogno di un ViewController personalizzato per il mio PageViewController. Nel mio esempio questa è la seguente classe.

@interface PageZoomViewController : UIViewController 

@property (nonatomic) int pageIndex; 

@end 

Quindi nei metodi viewControllerAfter/Before è possibile passare l'indice alla nuova pagina.

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 

    int nextPageIndex = ((PageZoomViewController *)viewController).pageIndex-1; 

    PageZoomViewController *controller = [[PageZoomViewController alloc] initWithPageViewControlParent:self andFrame:[self frameForPagingScrollView] andPageIndex:nextPageIndex]; 

    return controller; 
} 

Quando l'animazione per la pagina successiva è terminata, è possibile impostare facilmente l'indice corrente in questo modo.

-(void)pageViewController:(UIPageViewController *)thePageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed { 

    if(completed) { 
     index = ((PageZoomViewController *)thePageViewController.viewControllers[0]).pageIndex; 
    } 
} 

Spero che questo aiuti!