Ios 具有3个视图控制器页面的页面视图控制器

Ios 具有3个视图控制器页面的页面视图控制器,ios,ipad,uipageviewcontroller,Ios,Ipad,Uipageviewcontroller,我对iPad的开发还不熟悉。我知道如何使用页面视图控制器的图像。我的问题是我有三个图表,我已经在三个视图控制器中完成了。。如何将所有视图控制器合并到一个页面视图控制器中。我现在保留了三个视图控制器 我已经尝试了很多教程,但没有一个能解释如何使用三个视图控制器 我现在已经这样做了,但这是错误的 -(IBAction)handleSwipeLeft:(UISwipeGestureRecognizer*)sender { LastLearningSessionViewController *

我对iPad的开发还不熟悉。我知道如何使用页面视图控制器的图像。我的问题是我有三个图表,我已经在三个视图控制器中完成了。。如何将所有视图控制器合并到一个页面视图控制器中。我现在保留了三个视图控制器

我已经尝试了很多教程,但没有一个能解释如何使用三个视图控制器 我现在已经这样做了,但这是错误的

-(IBAction)handleSwipeLeft:(UISwipeGestureRecognizer*)sender {

    LastLearningSessionViewController *last=[[LastLearningSessionViewController alloc]init];
    [self presentViewController:last animated:YES completion:nil];
}

从我看来,你可能做得有点错

首先,您需要为
UIPageViewController
创建一个控制器,它是一个数据源和委托

请注意,所有代码都已直接写入答案,且未经测试。

MyUIPageViewController.h

@interface
MyUIPageViewController : UIViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>
{
  NSNumber *currentIndex //Using NSNumber to handle 32bit/64bit easier.
}
@property (nonatomic, strong) UIPageViewController *pageViewController
@property (nonatomic, strong) NSArray *controllersArray //Used to help navigate between controllers
@end
查看参考文档也很方便:


您必须创建一个页面视图控制器并向其中添加三个容器视图控制器,然后在每个容器中嵌入相应的图表视图控制器
#import MyUIPageViewController.h

@implementation MyUIPageViewController

- (instancetype)initWithNibName:(NSString *)nibName
                     bundle:(NSBundle *)nibBundle
{
  if(self = [super initWithNibName:nibName bundle:nibBundle])
  {
     //Create ChartViewController1 (UIViewController *ChartViewController1 = [[ChartViewController1Class alloc] init];)
     //Create ChartViewController2
     //Create ChartViewController3

     //Now we have created all 3 chartViewControllers, create our controllers Array with the controller objects.         

     self.controllersArray = [[NSArray alloc] initWithObjects:ChartViewController1, ChartViewController2, ChartViewController3];

     //Currently setting to 0. A proper way of handling with Multi-tasking is to store the index value from before, but not dealing with that right now.
     currentIndex = [NSNumber numberWithInt:0];

     //Create our PageViewController. Currently set to PageCurl and all pages will go from left to right.
     //These options can be changed, if so desired (Scroll Effect like iBooks Textbooks and a page change from bottom to top like a flip book.

     self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

    //Set ourselves as the datasource and delegate to handle the pages etc.

    self.pageViewController.datasource = self;
    self.pageViewController.delegate = self;

    //We need to set the viewControllers for the PageViewController, because this is the initial load, we will not animate the change.

    [self.pageViewController setViewControllers:self.controllersArray direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:^ (BOOL finished) {
    //No animation is being done so no need to worry.
}];

     //Set our view to be the pagecontroller's view, so we can see it all.
     self.view = self.pageViewController.view;
  }

 return self;
}

//DataSource Methods:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
  viewControllerBeforeViewController:(UIViewController *)viewController
{
   //As this method looks for the previous view controller. If our current index is 0, there is no previous VC. But using the objectAtIndex method on the array would throw a outOfRange exception

   if([self.currentIndex intValue] <= 0)
   {
     return nil;
   }
   else
   {
     return [self.controllersArray objectAtIndex:([self.currentIndex intValue] - 1)];
   }
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
   viewControllerAfterViewController:(UIViewController *)viewController
{
   //As this method looks for the next view controller. If our current index is the maximum value the array count and be (2), there isn't a new VC to push. But using the objectAtIndex method on the array would throw a outOfRange exception

   if([self.currentIndex intValue] >= self.controllersArray.count)
   {
     return nil;
   }
   else
   {
     return [self.controllersArray objectAtIndex:([self.currentIndex intValue] + 1)];
   }
}

//Delegate Methods

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
   if(transitionCompleted)
   {
     //We will update our currentIndex, only if the transition has happened.

     switch (previousViewControllers)
     {
       case 0:
       //Something went wrong :S
       break;
       case 1:
       //We are either in Vertical Orientation of the first viewController is only being shown.
       if([pageViewController.viewControllers contains:[self.controllersArray objectAtIndex:([currentIndex intValue]+ 1)]])
       {
         currentIndex = [NSNumber numberWithInt:([currentIndex intValue] + 1)];
       }
       else
       {
         if([currentIndex intValue] == 0)
         {
           //Saftey Net.
         }
         else
         {
         currentIndex = [NSNumber numberWithInt:([currentIndex intValue] - 1)];
         }
       }
       break;
       case 2:

       //We are in horizontal Orientation.

       //With 3 View Controllers the only ViewController that will be in both arrays is the ViewController at index 1. We just need to see if the pageViewControllers viewcontrollers array contains the ViewController at index 0 or index 1.
       if([pageViewController.viewControllers contains:[self.controllersArray objectAtIndex:([currentIndex intValue]+ 1)]])
       {
         currentIndex = [NSNumber numberWithInt:([currentIndex intValue] + 1)];
       }
       else
       {

         if([currentIndex intValue] == 0)
         {
           //Saftey Net.
         }
         else
         {
         currentIndex = [NSNumber numberWithInt:([currentIndex intValue] - 1)];
         }

       }

       break;
       default:
       //Should never reach here.
       break;
     }
   }
}
@end