2012-03-19 6 views
7

Ho un UIPageViewController che utilizza un numero intero per indicare su quale pagina è attiva. Funziona bene, ma se l'utente fa rapidamente scorrere più volte per arrivare a una pagina più indietro, il numero intero cambia più rapidamente di quanto facciano le viste, e quindi l'intera cosa cade a pezzi (l'app pensa che sia a pagina 7 quando potrebbe essere visualizzazione pagina 3). Che cosa sto facendo di sbagliato? C'è un metodo diverso che dovrei usare per dire dove sono? Grazie.Le viste di UIPageViewController incasinate se l'utente si sposta troppo rapidamente

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    if (pageNumber == 0) { 
     pageNumber++; 
     NSLog(@"%i", pageNumber); 
     Two *two = [[Two alloc] init]; 
     return two; 
    } else if (pageNumber == 1) { 
     pageNumber++; 
     NSLog(@"%i", pageNumber); 
     Three *three = [[Three alloc] init]; 
     return three; 
    } else if (pageNumber >= 2) { 
     return nil; 
    } else { 
     return nil; 
    } 
} 
+0

Presumibilmente 'pageNumber' viene decrementato nel corrispondente' pageViewController:. ViewControllerBeforeViewController : "Quando dici" l'app pensa che sia a pagina 7 ", intendi che quando guardi a' pageNumber' dopo una serie di swip molto veloci, è impostato su 7? Quale vista viene visualizzata a quel punto? –

+0

Sì, è corretto.Se si scorre molto rapidamente, il numero intero aumenta di molto, ma le pagine non si girano più rapidamente, causando l'intero e il numero effettivo della pagina fuori sincrono, a volte di una quantità elevata. –

+0

Ma , dal momento che stai restituendo 'nil' qui ogni volta che' pageNumber> = 2', e non lo cambia, dove altro è 'pageNumber' essere incrementato? Cosa dovrebbe essere visualizzato? E cosa viene effettivamente visualizzato? –

risposta

9

Il problema è che stai prendendo pageNumber per scontato. UIPageViewController potrebbe richiedere solo il prossimo viewController per precaricarlo e lo stai già aumentando pageNumber.

Eri vicino quando hai notato che "questo accade anche se un utente afferra il bordo della pagina e inizia a spostarlo, ma poi lo mette e torna indietro rimane nella pagina corrente."

Questo metodo ottiene UIViewController per parametro e questo è l'unico riferimento reale in vostro possesso.

Dal momento che hai solo tre pagine un modo per risolvere questo sarebbe:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    if ([viewController isKindOfClass: [One class]]) 
    { 
     Two *two = [[Two alloc] init]; 
        return two; 
    } 
    else if ([viewController isKindOfClass: [Two class]]) 
    { 
     Three *three = [[Three alloc] init]; 
        return three; 
    } 
    else 
    { 
        return nil; 
    } 
} 

Nota: questo codice non è la soluzione migliore - Sto solo cercando di sottolineare che non si deve essere semplicemente aumentando/diminuendo pageNumber in viewControllerAfterViewController:/viewControllerBeforeViewController:

si potrebbe anche [[... alloc ]init] viewControllers prima di tutto questo e ridurre l'attività inizializzazione di viewControllers in UIPageViewControllerDataSource metodi per loadView (se' s non caricato) al massimo. Per esempio (abbreviato):

... 
    if ([viewController isKindOfClass: [One class]]) 
    { 
     //Two *two = [[Two alloc] init]; //called before and two is someone's property 
     if (![two isViewLoaded]) [two loadView]; 
     return two; 
    } 
    else if ... 

Per più pagine si potrebbe anche provare codifica viewControllers (durante la loro inizializzazione). Dal momento che UIViewController sé non ha una proprietà tag probabilmente si potrebbe usare viewController.view.tag o sublcass UIViewController e lo si aggiunge una proprietà pageNumber (questo probabilmente sarebbe vicino alla soluzione

+1

Hai fatto la mia giornata! Grazie. – androniennn

+0

@androniennn: prego! :) –

Problemi correlati