2013-04-19 9 views
5

Verhalten Ich sehe ein unterschiedliches Verhalten zwischen einem UIPageViewController mit Scroll Übergängen gegenüber PageCurl. PageCurl funktioniert so, wie ich es erwarte, aber wenn ich Scroll-in verwende, sehe ich manchmal extra (unsinnige) Anrufe an viewControllerBeforeViewController: und viewControllerAfterViewController: Erkennt jemand dieses Muster von zusätzlichen Datenquellenaufrufen?UIPageViewController Verhalten für Scroll & PageCurl

Ich zeige eine Reihe von Bildern an und ich kann überall in der Sequenz beginnen. Wenn ich den Scroll-Übergang verwende, aber nicht PageCurl, nachdem die erste Seite angezeigt wird, wenn ich nach "rechts" gehe, erhalte ich 3 DataSource-Aufrufe statt der einzigen, die ich erwarte. Für das unten gezeigte Beispiel begann ich bei meinem Indexwert von 3. Wenn ich wische, um zum "nächsten" Bild zu wechseln, erwarte ich einen einzelnen viewControllerAfterViewController: Aufruf von Index 3, um zu Index 4 zu gelangen. Wenn ich einen Test durchführe, bekomme ich zwei zusätzliche Anrufe: eine für Vor Index 3 (dh 2) und eine für Nach Index 4 (dh 5). Die Ausgabe lautet:

2013-04-19 12:37:33.964 Clouds[496:907] Page 3 - viewControllerAfterViewController called on this index 
2013-04-19 12:37:33.988 Clouds[496:907] Page 3 - viewControllerBeforeViewController called on this index 
2013-04-19 12:37:34.010 Clouds[496:907] willTransitionToViewControllers to indices 
2013-04-19 12:37:34.014 Clouds[496:907] Page 4 
2013-04-19 12:37:34.461 Clouds[496:907] Page 4 - viewControllerAfterViewController called on this index 

Die Ansicht, dass nach all dies angezeigt wird, ist in der Tat die Ansicht für den Index 4. Nach diesem ersten Übergang scheinen die UIPageViewController so, wie ich erwarte zu verhalten. Wenn ich den PageCurl-Übergang verwende, verhält es sich immer so, wie ich es erwarte, und ich erhalte keine dieser überflüssigen Anrufe.

Der Code, der tatsächlich die Ausgabe erzeugt wird:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    self.pageViewController.delegate = self; 
    self.pageViewController.dataSource = self; 


    CloudImageVC *startingViewController = [self viewControllerAtIndex:self.currentPage storyboard:self.storyboard]; 
    NSArray *viewControllers = @[startingViewController]; 
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 

    [self addChildViewController:self.pageViewController]; 
    [self.view addSubview:self.pageViewController.view]; 

    CGRect pageViewRect = self.view.bounds; 
    self.pageViewController.view.frame = pageViewRect; 

    [self.pageViewController didMoveToParentViewController:self]; 

    // Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily. 
    self.view.gestureRecognizers = self.pageViewController.gestureRecognizers; 
} 

- (CloudImageVC *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard { 
    // Return the data view controller for the given index. 
    if (index >= [self.imageNames count]) { 
     return nil; 
    } 
    self.dataViewController = [self makeDataViewControllerAtIndex:index storyboard:storyboard]; 
    return self.dataViewController; 
} 

- (CloudImageVC *) makeDataViewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard { 
    // Make and return the data view controller for the given index. 
    if (index >= [self.imageNames count]) { 
     return nil; 
    } 
    // Create a new view controller and pass suitable data. 
    self.dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"CloudImageVC"]; 
    self.dataViewController.imageIndex = index; 
    //self.dataViewController.cloudImage = nil; 
    return self.dataViewController; 
} 

- (NSUInteger)indexOfViewController:(CloudImageVC *)viewController 
{ 
    // Return the index of the given data view controller. 
    // For simplicity, we store the index value in the view controller. 
    return viewController.imageIndex; 
} 

#pragma mark - Page View Controller Data Source 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController]; 
    NSLog(@"Page %d - viewControllerBeforeViewController called on this index", index); 
    if ((index == 0) || (index == NSNotFound)) { 
     return nil; 
    } 
    index--; 
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController]; 
    NSLog(@"Page %d - viewControllerAfterViewController called on this index", index); 
    if (index == NSNotFound) { 
     return nil; 
    } 

    index++; 
    if (index == self.imageNames.count) { 
     return nil; 
    } 
    return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

#pragma mark - Protocol UI PageViewController Delegate 

- (void) pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { 
    NSLog(@"willTransitionToViewControllers to indices"); 
    for (CloudImageVC *vc in pendingViewControllers) { 
     NSLog(@"Page %d",vc.imageIndex); 
    } 
} 
+3

Ja, ich habe dieses Muster gesehen, und es ist nicht unsinnig. Wenn ein Seitenaufruf-Controller auf den Bildlaufübergang eingestellt ist, wird eine Bildlaufansicht in die Ansichtshierarchie eingefügt, und die zusätzlichen Aufrufe dienen zum Abrufen des vorherigen und des nächsten Controllers, sodass Sie beim nächsten Bildlauf (oder vorherige) eine gleichzeitig mit der aktuellen. – rdelmar

+0

Vielen Dank für die Info. Es ist schön zu wissen, dass ich keinen Bug habe! –

+0

@rdelmar Aber in meinem Fall nennt es nicht das "vorher", sondern nur das "nächste" zweimal. Hast du eine Idee, warum? –

Antwort

0

Die Antwort im Kommentar von rdelmar ist.