UIPageViewController with different ViewControllers, right way?

后端 未结 4 1257
半阙折子戏
半阙折子戏 2021-01-03 02:25

Basically, I have a Table View Controller and a normal View Controller, I want to make it so that I can swipe between the view controllers like on the home screen of app (ob

4条回答
  •  攒了一身酷
    2021-01-03 03:05

    I had the same issue, here's what i did and working perfectly.

    .h

    @interface ViewController : UIViewController 
    
    @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:[NSString stringWithFormat:@"%@", 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;
    }
    

    Note:

    self.viewControllerIDArr containers Storyboard ID's of the viewControllers.

    It looks like this in storyboard:

提交回复
热议问题