在 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 中从不透明