UIPageViewController avec différents ViewControllers, juste?

Fondamentalement, j'ai un controller Table View et un controller de vue normal, je veux faire en sorte que je puisse glisser entre les controllers de vue comme sur l'écran d'accueil de l'application (le même type de controller de vue évident).

Mais la chose que je trouve est que le UIpageviewcontroller est généralement utilisé lorsque vous avez plusieurs vues du même type de viewcontroller par exemple glisser des images, vous pouvez simplement définir un index dans la class et un tableau d'images relatives à l'index et au set comme ça.

Mais j'essaie d'get différents controllers de vue dans cette configuration. En ce moment, il est deux mais va certainement aller jusqu'à environ 4.

UIPageViewController est le bon moyen de le configurer ou autre chose.

EDIT: Code ajouté ci-dessous

  // // ViewController.m // testb // #import "MainPostController.h" #import "MainTableViewController.h" #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize pageViewController; @synthesize indexValue = _indexValue; - (void)viewDidLoad { [super viewDidLoad]; self.indexValue= 1; NSLog(@"main intitated"); // Do any additional setup after loading the view, typically from a nib. self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; self.pageViewController.dataSource = self; MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; MainPostController *pvc; NSArray *viewcontrollers =[NSArray arrayWithObjects:tvc, pvc, nil]; [self.pageViewController setViewControllers:viewcontrollers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 30); [self addChildViewController:pageViewController]; [self.view addSubview:pageViewController.view]; [self.pageViewController didMoveToParentViewController:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if (self.indexValue == 1) { MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"]; self.indexValue = 0 ; return pvc; } else return nil; } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if (self.indexValue == 0) { MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; self.indexValue = 1; return tvc; } else return nil; } @end 

Je veux que la vue initiale soit le controller de vue de table (tvc) et je veux que le controller Post View (pvc) soit à sa gauche. Je peux le charger et glisser entre les deux facilement, mais parfois je peux glisser plus loin que les limites si fondamentalement si je commence sur le tvc -> pvc -> tvc alors je peux aller plus loin en balayant à droite au même téléviseur puis le la limite est atteinte ou aller dans l'autre sens tvc -> pvc -> tvc -> pvc -> pvc en balayant à gauche pour la dernière transition. Les limites sont atteintes à la fin. Une fois que l'application démarre intialement sur tvc, je ne peux pas avancer une page (ce qui devrait arriver) et si je vais tvc -> pvc et essaye d'aller sur une page à gauche, elle ne me laisse pas (ce qui devrait arriver )

Merci

Enfin fait, n'a pas eu à append des propriétés aux différentes classs. Juste testé la class. Voici le code:

 -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { if ([viewController isKindOfClass:[MainTableViewController class]]) { MainPostController *pvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainPostController"]; return pvc; } else return nil; } -(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { if ([viewController isKindOfClass:[MainPostController class]]) { MainTableViewController *tvc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainTableViewController"]; return tvc; } else return nil; } 

Il devrait être facile d'append plus de controllers de vue car j'ai juste besoin d'append d'autres instructions if pour les tester. Le principal résolveur de problème était la méthode isKindOfClass:

Merci pour votre réponse les gars!

J'ai eu le même problème, voici ce que j'ai fait et fonctionne parfaitement.

.h

 @interface ViewController : UIViewController <UIPageViewControllerDataSource> @property (strong, nonatomic) UIPageViewController *pageViewController; @property (nonatomic) NSArray *viewControllerIDArr; @end 

.m

 @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self setupDefaults]; } - (void)setupDefaults { self.viewControllerIDArr = @[@"FirstViewController", @"SecondViewController"]; self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; self.pageViewController.dataSource = self; UIViewController *startingViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[0]]; NSArray *viewControllers = @[startingViewController]; [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 45); [self addChildViewController:_pageViewController]; [self.view addSubview:_pageViewController.view]; [self.pageViewController didMoveToParentViewController:self]; } - (UIViewController *)getViewControllerFromClass:(Class)class isNext:(BOOL)next { NSInteger index = [self.viewControllerIDArr indexOfObject:[NSSsortingng ssortingngWithFormat:@"%@", class]]; if (next) index+=1; else index-=1; if (index < 0 || index >= self.viewControllerIDArr.count) return nil; else return [self.storyboard instantiateViewControllerWithIdentifier:self.viewControllerIDArr[index]]; } #pragma mark - Page View Controller Data Source - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { return [self getViewControllerFromClass:viewController.class isNext:NO]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { return [self getViewControllerFromClass:viewController.class isNext:YES]; } - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController { return 0; } - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController { return 0; } 

Remarque:

self.viewControllerIDArr contient les ID de storyboard des viewControllers.

Cela ressemble à ceci dans le storyboard:

entrez la description de l'image ici

C'est une vieille question mais depuis que je suis tombé sur ce problème, je postrai ma solution.

La première fois que j'ai fait cela, j'ai ajouté mon code

 func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { } 

Qui a reçu des problèmes lorsque vous faites défiler continuellement les vues à l'aide de deux doigts et didFinishAnimating n'est pas appelé, sauf si le défilement s'arrête.

Donc j'ai juste utilisé cette méthode de délégué à la place.

 func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) { let currentView = pendingViewControllers[0] if currentView is UINavigationController && currentView.restorationIdentifier == "Settings" { index = 0 } else if currentView is UINavigationController && currentView.restorationIdentifier == "Main" { index = 1 } else if currentView is UINavigationController && currentView.restorationIdentifier == "Message" { index = 2 } } 

Où currentView est l'actuel UIViewController (ou UINavigationController comme ce que j'utilise, en utilisant un UINavigationController pour identifier mon controller de navigation), et index est une valeur globale pour savoir quel UIViewController dans le tableau instancier.

Vous pouvez utiliser un UIViewPageViewController, avec une certaine logique personnalisée.

Comme vous le dites, la façon habituelle de gérer cela est de faire en sorte que la source de données du controller de vue de page crée simplement le même type de controller de vue pour chaque page et le remplisse avec datatables de votre model.

Dans votre cas, vous pouvez append une propriété pageNumber à tous les controllers de vue que vous allez héberger dans votre controller de vue de page. Ensuite, dans les methods de source de données, utilisez le numéro de page de l'ancien controller de vue pour déterminer le nouveau numéro de page. Ensuite, ayez une instruction switch basée sur le numéro de page. Chaque cas dans l'instruction switch créerait un type différent de controller de vue.