ChildViewController的应用

http://www.it165.net/pro/html/201506/44038.html

  • ChildViewController的应用

    viewControlle中可以添加多个subView,在需要的时候显示出来;另一种方法是通过向parentViewController中可以添加多个childCiewController;来控制页面中的subView,降低代码耦合度;通过切换子视图控制器,可以显示不同的view;,替代之前的addSubView的管理。

    本节通过类似百度新闻模块切换的界面来演示ChileViewController的应用:

    文档结构:

    \

    代码演示:

    001. #import "MainViewController.h"
    002. #import "FirstViewController.h"
    003. #import "SecondViewController.h"
    004. #import "ThirdViewController.h"
    005. @interface MainViewController ()
    006. @property (nonatomic, strong) FirstViewController *firstVC;
    007. @property (nonatomic, strong) SecondViewController *secondVC;
    008. @property (nonatomic, strong) ThirdViewController *thirdVC;
    009. @property (nonatomic, strong) UIViewController *currentVC;
    010.  
    011. @property (nonatomic, strong) UIScrollView *headScrollView;
    012. @property (nonatomic, strong) NSMutableArray *itemArray;
    013. @property (nonatomic, strong) UIView *contentView;
    014. @end
    015.  
    016. @implementation MainViewController
    017. - (void)loadView{
    018. [super loadView];
    019. [self initialization];
    020. }
    021.  
    022. - (void)viewDidLoad {
    023. [super viewDidLoad];
    024. [self loadBaseUI];
    025. }
    026.  
    027. - (void)initialization{
    028. _itemArray = [NSMutableArray arrayWithObjects:@"头条",@"今日",@"焦点", nil];
    029. }
    030.  
    031. - (void)loadBaseUI{
    032. self.title = @"首页";
    033. _headScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(00, [UIScreen mainScreen].bounds.size.width, 44)];
    034. _headScrollView.backgroundColor = [UIColor colorWithWhite:0.902 alpha:1.000];
    035. for (int i = 0; i<_itemArray.count; i++) {
    036. UIButton *itemButton = [[UIButton alloc]initWithFrame:CGRectMake(i*([UIScreen mainScreen].bounds.size.width/_itemArray.count), 0, [UIScreen mainScreen].bounds.size.width/_itemArray.count, 44)];
    037. itemButton.tag = 100+i;
    038. itemButton.backgroundColor = [UIColor clearColor];
    039. NSDictionary *dic = @{NSForegroundColorAttributeName:[UIColor purpleColor],NSFontAttributeName:[UIFont systemFontOfSize:14.0f]};
    040. [itemButton setAttributedTitle:[[NSAttributedString alloc]initWithString:_itemArray[i] attributes:dic] forState:UIControlStateNormal];
    041. [itemButton addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    042. [_headScrollView addSubview:itemButton];
    043. }
    044. [_headScrollView setContentSize:CGSizeMake([UIScreen mainScreen].bounds.size.width, 44)];
    045. _headScrollView.showsHorizontalScrollIndicator = NO;
    046. _headScrollView.showsVerticalScrollIndicator = NO;
    047. [self.view addSubview:_headScrollView];
    048.  
    049. _contentView = [[UIView alloc]initWithFrame:CGRectMake(044, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height - 44 64)];
    050. _contentView.backgroundColor = [UIColor clearColor];
    051. [self.view addSubview:_contentView];
    052.  
    053. [self addSubControllers];
    054. }
    055.  
    056. #pragma mark - privatemethods
    057. - (void)addSubControllers{
    058. _firstVC = [[FirstViewController alloc]initWithNibName:@"FirstViewController" bundle:nil];
    059. [self addChildViewController:_firstVC];
    060.  
    061. _secondVC = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
    062. [self addChildViewController:_secondVC];
    063.  
    064. _thirdVC = [[ThirdViewController alloc]initWithNibName:@"ThirdViewController" bundle:nil];
    065. [self addChildViewController:_thirdVC];
    066.  
    067. //调整子视图控制器的Frame已适应容器View
    068. [self fitFrameForChildViewController:_firstVC];
    069. //设置默认显示在容器View的内容
    070. [self.contentView addSubview:_firstVC.view];
    071.  
    072. NSLog(@"%@",NSStringFromCGRect(self.contentView.frame));
    073. NSLog(@"%@",NSStringFromCGRect(_firstVC.view.frame));
    074.  
    075. _currentVC = _firstVC;
    076. }
    077.  
    078. - (void)buttonClick:(UIButton *)sender{
    079. if ((sender.tag == 100 && _currentVC == _firstVC) || (sender.tag == 101 && _currentVC == _secondVC) || (sender.tag == 102 && _currentVC == _thirdVC)) {
    080. return;
    081. }
    082. switch (sender.tag) {
    083. case 100:{
    084. [self fitFrameForChildViewController:_firstVC];
    085. [self transitionFromOldViewController:_currentVC toNewViewController:_firstVC];
    086. }
    087. break;
    088. case 101:{
    089. [self fitFrameForChildViewController:_secondVC];
    090. [self transitionFromOldViewController:_currentVC toNewViewController:_secondVC];
    091. }
    092. break;
    093. case 102:{
    094. [self fitFrameForChildViewController:_thirdVC];
    095. [self transitionFromOldViewController:_currentVC toNewViewController:_thirdVC];
    096. }
    097. break;
    098. }
    099. }
    100.  
    101. - (void)fitFrameForChildViewController:(UIViewController *)chileViewController{
    102. CGRect frame = self.contentView.frame;
    103. frame.origin.y = 0;
    104. chileViewController.view.frame = frame;
    105. }
    106.  
    107. //转换子视图控制器
    108. - (void)transitionFromOldViewController:(UIViewController *)oldViewControllertoNewViewController:(UIViewController *)newViewController{
    109. [self transitionFromViewController:oldViewController toViewController:newViewController duration:0.3options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
    110. if (finished) {
    111. [newViewController didMoveToParentViewController:self];
    112. _currentVC = newViewController;
    113. }else{
    114. _currentVC = oldViewController;
    115. }
    116. }];
    117. }
    118.  
    119. //移除所有子视图控制器
    120. - (void)removeAllChildViewControllers{
    121. for (UIViewController *vc in self.childViewControllers) {
    122. [vc willMoveToParentViewController:nil];
    123. [vc removeFromParentViewController];
    124. }
    125. }
    126.  
    127. /**
    128. *  方法说明:
    129. *  1、addChildViewController:向父VC中添加子VC,添加之后自动调用willMoveToParentViewController:父VC
    130. *  2、removeFromParentViewController:将子VC从父VC中移除,移除之后自动调用
    131. didMoveToParentViewController:nil
    132. *  3、willMoveToParentViewController:  当向父VC添加子VC之后,该方法会自动调用。若要从父VC移除子VC,需要在移除之前调用该方法,传入参数nil。
    133. *  4、didMoveToParentViewController:  当向父VC添加子VC之后,该方法不会被自动调用,需要显示调用告诉编译器已经完成添加(事实上不调用该方法也不会有问题,不太明白); 从父VC移除子VC之后,该方法会自动调用,传入的参数为nil,所以不需要显示调用。
    134. */
    135.  
    136. /**
    137. *  注意点:
    138. 要想切换子视图控制器a/b,a/b必须均已添加到父视图控制器中,不然会报错
    139. */
    140. @end

    最终效果:(实现了3个视图之间的切换)

    \ \ 

延伸阅读:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值