在 UIPageViewController 中使用 2 个不同的视图控制器作为页面

Posted

技术标签:

【中文标题】在 UIPageViewController 中使用 2 个不同的视图控制器作为页面【英文标题】:Using 2 different View Controllers in a UIPageViewController as Pages 【发布时间】:2013-12-16 00:31:54 【问题描述】:

所以我到处找,似乎找不到我要找的东西。基本上,我的应用程序中有 3 个不同的视图控制器。 (MainViewController、ChildViewController、TwitterViewController) 起初我只是在练习使用 ChildViewController 并更新标签以告知您当前所在的页面。但是,我想将 TwitterViewController 添加为“第 2 页”并将 ChildViewController 保留为“第 1 页”。

目前,我将 MainViewController 设置为 Delegate 和 DataSource,并将代码放回只使用一个“ChildViewController”作为不同页面。请让我知道这是否从那时起。如果需要,我会尝试重申。下面是我的代码。

MainViewController.m

#import "MainViewController.h"
#import "ChildViewController.h"
#import "TwitterViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

    self.pageController.dataSource = self;
    [[self.pageController view] setFrame:[[self view] bounds]];

    ChildViewController *initialViewController = [self viewControllerAtIndex:0];

    NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

    [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

    [self addChildViewController:self.pageController];
    [[self view] addSubview:[self.pageController view]];
    [self.pageController didMoveToParentViewController:self];

    UIPageControl *pageControl = [UIPageControl appearance];
    pageControl.pageIndicatorTintColor = [UIColor blackColor];
    pageControl.currentPageIndicatorTintColor = [UIColor redColor];



- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
    NSUInteger index = [(ChildViewController *)viewController index];

    if (index == 0) 
        return nil;
    

    index--;

    return [self viewControllerAtIndex:index];


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
    NSUInteger index = [(ChildViewController *)viewController index];

    index++;

    if (index == 2) 
        return nil;
    

    return [self viewControllerAtIndex:index];


- (ChildViewController *)viewControllerAtIndex:(NSUInteger)index 
    ChildViewController *first = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil];
    first.index = index;

    return first;


- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
    return 2;


- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController 
    return 0;


- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.

@end

ChildViewController.m

#import "ChildViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ChildViewController ()

@end

@implementation ChildViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;


- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.screenNumber.text = [NSString stringWithFormat:@"This is Page #%d", self.index];
    self.screenNumber.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];
    self.screenNumber.layer.cornerRadius =10;    


- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:YES];



- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

TwitterViewController 是默认的,尚未编写。目前只是尝试使用空白的 ViewController。

任何帮助都会很棒!谢谢大家!

【问题讨论】:

【参考方案1】:

每个视图控制器都需要索引。因此,如果您创建一个 UIViewController 类作为基类,该类将具有一个属性“索引”来存储索引,那就太好了。然后子类化这个基类来创建 ChildViewController 和 TwitterViewContoller。将方法(ChildViewController *)viewControllerAtIndex:(NSUInteger)index 更改为 (BaseViewController *)viewControllerAtIndex:(NSUInteger)index.

在方法内部,根据索引返回适当的视图控制器。

【讨论】:

啊!谢谢!我知道我错过了一些东西。所以,基本上创建一个新的类。我将使用您的示例 BaseViewController。我现在将有 4 个单独的视图控制器。 Main、Child、Twitter,现在是 Base。我想我被困在的地方是我在基本视图控制器中到底放了什么?我想这是一个完全不同的问题。我将实施这一点,让你知道它是怎么回事!再次感谢!

以上是关于在 UIPageViewController 中使用 2 个不同的视图控制器作为页面的主要内容,如果未能解决你的问题,请参考以下文章

ViewDidLoad 不断在 UIPageViewController 上被调用

UIPageViewController 背景在 Objective C iOS 中从不透明

获取 UIPageViewController 的滚动位置

在故事板中使用 UIPageViewController

如何在 UIPageViewController 和孩子之间正确传递对象

使用 UIPageViewController 在多个视图控制器之间滑动