UIPageViewController, comment puis-je correctement accéder à une page spécifique sans perturber le fonctionnement de l'ordre spécifié par la source de données?

J'ai trouvé quelques questions sur la façon de faire un UIPageViewController accéder à une page spécifique, mais j'ai remarqué un problème ajouté avec le saut qu'aucune des réponses semblent reconnaître.

Sans entrer dans les détails de mon application iOS (qui est semblable à un paginé calendrier), voici ce que je suis en train de vivre. Je déclare une UIPageViewController, la vue-contrôleur, et de mettre en œuvre une source de données.

//end of the init method
        pageViewController = [[UIPageViewController alloc] 
        initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
          navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
                        options:nil];
        pageViewController.dataSource = self;
        [self jumpToDay:0];
}

//...

- (void)jumpToDay:(NSInteger)day {
        UIViewController *controller = [self dequeuePreviousDayViewControllerWithDaysBack:day];
        [pageViewController setViewControllers:@[controller]
                                    direction:UIPageViewControllerNavigationDirectionForward
                                     animated:YES
                                   completion:nil];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
        NSInteger days = ((THDayViewController *)viewController).daysAgo;
        return [self dequeuePreviousDayViewControllerWithDaysBack:days + 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
        NSInteger days = ((THDayViewController *)viewController).daysAgo;
        return [self dequeuePreviousDayViewControllerWithDaysBack:days - 1];
}

- (UIViewController *)dequeuePreviousDayViewControllerWithDaysBack:(NSInteger)days {
        return [[THPreviousDayViewController alloc] initWithDaysAgo:days];
}

Modifier Note: j'ai ajouté simplifié le code pour la file d'attente de la méthode. Même avec cette mise en œuvre blasphématoire j'ai exactement le même problème avec la page de commande.

L'initialisation de tous les travaux comme prévu. L'augmentation de la pagination tout fonctionne très bien. Le problème c'est que si j'appel jumpToDay de plus, l'ordre devient confuse.

Si l'utilisateur est sur la journée -5 et les sauts de la journée 1, un défilement vers la gauche pour révéler le jour de -5 à nouveau à la place des 0 jours. Cela semble avoir quelque chose à voir avec la façon dont UIPageViewController conserve une référence à la proximité de pages, mais je ne trouve pas de référence à une méthode qui permettrait de forcer l'actualisation du cache.

Des idées?

  • Je ne pense pas que le problème a à voir avec la façon dont un contrôleur de la page conserve une référence à la proximité de pages, je ne pense pas qu'il n'a même que. Il est de votre responsabilité, dans la mise en œuvre de votre source de données, pour garder une trace des pages. Donc, quelque chose qui est probablement mal avec daysAgo ou avec la dequeuePreviousDayViewControllerwithdaysback: la méthode.
  • avez-vous résoudre ce problème ? Je vais avoir le même problème ?
  • Normalement je me serais admettre que c'est de ma faute, mais de la "file d'attente" méthode littéralement juste instancie un contrôleur de même type avec une référence interne à l'égard de "jours". Il n'a même pas de faire de la fantaisie de l'attente et allocing qu'une UITableView prend soin de ses dequeueing méthode.
  • N'ai pas trouvé de solution, mais étant donné que ce besoin d'être fait aujourd'hui, je suis envisage le déploiement de mon propre pageviewcontroller classe. Je vais vous laisser savoir si ça fonctionne.
  • J'allais rejoindre rdelmar de l'opinion. J'ai mis en place un UIPageViewController avec environ les mêmes propriétés, et je n'ai jamais eu aucun problème. Qu'obtenez-vous que de jours dans viewControllerBeforeViewController ?
  • Eh bien, alors il y a quelque chose de mal avec daysAgo puisque c'est la seule chose à déterminer quel contrôleur est instanciée. Comme pour rouler vos propres, si vous êtes en train de faire une seule page à la fois, puis il ne me semble que l'affichage de la page contrôleur n'a que ça pour vous. J'ai fait une, j'ai appelé un anneau de contrôleur qui vous permet d'aller de l'avant et en arrière d'une page, et également de passer à une autre page. Il n'était pas difficile à mettre en œuvre mais mon actuel de la mise en œuvre instancie toutes les contrôleurs à l'avant, ce qui n'est pas très efficace en terme de mémoire.
  • daysAgo est littéralement juste un accesseur pour la NSInteger passé dans la méthode init. Je suis d'accord avec vous qu'un UIPageViewController est probablement pas ce que je cherche dans cette situation compte tenu de certains des autres limites que j'en vois (par exemple, la capacité d'observer le contenu de décalage de pages). Pour votre bague de contrôleur, êtes-vous juste de jeter toutes les pages en un UIScrollView? J'ai vu certaines applications faire quelque chose de similaire, mais n'était pas sûr de savoir comment ils l'ont accompli.
  • Cette question/réponse résout le problème beaucoup plus facile. stackoverflow.com/questions/22554877/...

InformationsquelleAutor Kyle | 2012-11-29