2015-04-20 10 views
11

La documentazione per il valore di ritorno di presentationIndexForPageViewController: dice:Cosa devo restituire in presentationIndexForPageViewController: per UIPageViewControllerDataSource?

restituisce l'indice della voce selezionata per essere riflessa nel indicatore della pagina.

Tuttavia, questo è vago. Chiamerà questo metodo e si aspetta l'indice corretto mentre l'utente scorre attraverso il controller della visualizzazione di pagina?

Inoltre, non ci sono garanzie su quando pageViewController:viewControllerBeforeViewController: e pageViewController:viewControllerAfterViewController:. La documentazione menziona semplicemente:

[An] oggetto [fornisce] visualizza i controller per il controller della visualizzazione di pagina in base alle necessità, in risposta ai movimenti di navigazione.

In effetti, ho visto la memorizzazione nella cache in determinate circostanze. Ad esempio, sembra che un controller di visualizzazione venga deallocato solo se si naviga in avanti di due pagine. Altrimenti vuole tenerlo nella cache nel caso in cui l'utente si sposti indietro nel controller della visualizzazione di pagina.

Ciò significa quindi che ho bisogno di un modo coerente per sapere quale pagina viene attualmente visualizzata registrando come UIPageViewControllerDelegate e quindi constantly updating this value?

risposta

9

quanto riguarda presentationCountForPageViewController: e presentationIndexForPageViewController:, gli stati di documentazione:

Entrambi questi metodi sono chiamati dopo che il metodo setViewControllers:direction:animated:completion: viene chiamato. Dopo la navigazione basata sui gesti, questi metodi non vengono chiamati. L'indice viene aggiornato automaticamente e il numero di controller di visualizzazione è previsto che rimanga costante.

Pertanto, sembra che dobbiamo solo restituire un valore valido immediatamente dopo che è stato chiamato setViewControllers:direction:animated:completion:.

Ogni volta a implementare l'origine dei dati, crea un metodo di supporto, showViewControllerAtIndex:animated:, e tenere traccia del valore di tornare in una proprietà presentationPageIndex:

@property (nonatomic, assign) NSInteger presentationPageIndex; 
@property (nonatomic, strong) NSArray *viewControllers; // customize this as needed 

// ... 

- (void)showViewControllerAtIndex:(NSUInteger)index animated:(BOOL)animated { 
    self.presentationPageIndex = index; 
    [self.pageViewController setViewControllers:@[self.viewControllers[index]] direction:UIPageViewControllerNavigationDirectionForward animated:animated completion:nil]; 
} 

#pragma mark - UIPageViewControllerDataSource 

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { 
    return self.presentationPageIndex; 
} 

È quindi possibile utilizzare questo metodo per mostrare la visualizzazione corretta controller e fare in modo che l'indice selezionato visualizzi il valore corretto:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self showViewControllerAtIndex:0 animated:NO]; 
} 

- (IBAction)buttonTapped { 
    [self showViewControllerAtIndex:3 animated:YES]; 
} 
Problemi correlati