码迷,mamicode.com
首页 > 其他好文 > 详细

ChildViewController

时间:2015-12-19 00:10:04      阅读:313      评论:0      收藏:0      [点我收藏+]

标签:

//添加
[self addChildViewController:newVC];
//[newVC willMoveToParentViewController:self]; [self.view addSubview:newVC.view]; [newVC didMoveToParentViewController:self];
//删除 [oldVC willMoveToParentViewController:nil]; [oldVC.view removeFromSuperview]; [oldVC removeFromParentViewController];
//[oldVC didMoveToParentViewController:nil];
// 方法
addChildViewController:
removeFromParentViewController: 
transitionFromViewController:toViewController:duration:options:animations:completion: willMoveToParentViewController: didMoveToParentViewController:
// 属性 @property(nonatomic,readonly) NSArray *childViewControllers

 

上?面代码中写出了添加和移除ChildViewController的具体写法,添加过程:

1. 通过addChildViewController:添加?子控制器

2. 这一步为隐式调?用,系统在addChildViewController:?方法后会?自动调?用方法willMoveToParentViewController:

3. 将?子控制器视图添加进主视图

4. 通知?子控制器childViewController添加完成,这一步需要手动显示调用

移除过程与之相反,只是调用的几个方法名不?样。

在Apple官?方?文档上明确表?了必须要调?用didMoveToParentViewController和

willMoveToParentViewController?法来确认完成过程执?行完毕,初学者需要特别注意和?个方法的调?用顺序,使?用不当会导UIViewControllerHierarchyInconsistency的警告。

介绍了使?用?法,在来介绍一下使?用它的好处,好处就是规避了上面提到的两种误用产生的后果,具体就是:

1. 解决了代码的?高耦合

2. 系统在收到内存警告的时候会回收?一些并未显?示的view,释放内存

3. 这种?方式add进入的view是属于当前view hierarchy内,可以正常传递各种事件。

 

//在parent view controller 中添加 child view controller
   FirstViewController *firstViewController=[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
    [self addChildViewController:firstViewController];
    
    SecondViewController *secondViewController=[[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self addChildViewController:secondViewController];
    
    ThirdViewController *thirdViewController=[[ThirdViewController alloc] initWithNibName:@"ThirdViewController" bundle:nil];
    [self addChildViewController:thirdViewController];
    
    [self.view  addSubview:thirdViewController.view];

  // addChildViewController回调用[child willMoveToParentViewController:self] ,但是不会调用didMoveToParentViewController,所以需要显示调用
    [thirdViewController didMoveToParentViewController:self];
    currentViewController=thirdViewController;
    
  //切换child view controller
     [self transitionFromViewController:currentViewController toViewController:firstViewController duration:4 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
            }  completion:^(BOOL finished) {
               //......
            }];
    currentViewController=firstViewController;

  //移除child view controller
    // removeFromParentViewController在移除child前不会调用[self willMoveToParentViewController:nil] ,所以需要显示调用
    [currentViewController willMoveToParentViewController:nil];
    [currentViewController.view removeFromSuperview];
    [currentViewController removeFromParentViewController];

 

//
//  HMTMainViewController.m
//  UIScrollView
//
//  Created by HMT on 14-6-25.
//  Copyright (c) 2014年 humingtao. All rights reserved.
//

#import "HMTMainViewController.h"
#import "HMTFirstViewController.h"
#import "HMTSecondViewController.h"
#import "HMTThirdViewController.h"

@interface HMTMainViewController () <UIScrollViewDelegate>

@property (nonatomic ,strong) HMTThirdViewController  *thirdVC;
@property (nonatomic ,strong) HMTFirstViewController  *firstVC;
@property (nonatomic ,strong) HMTSecondViewController *secondVC;

@property (nonatomic ,strong) UIViewController *currentVC;

@property (nonatomic ,strong) UIScrollView *headScrollView;  //  顶部滚动视图

@property (nonatomic ,strong) NSArray *headArray;

@end

@implementation HMTMainViewController

- (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.
   
    self.navigationItem.title = @"网易新闻Demo";
    
    self.headArray = @[@"头条",@"娱乐",@"体育",@"财经",@"科技",@"NBA",@"手机"];
    /**
     *   automaticallyAdjustsScrollViewInsets   又被这个属性坑了
     *   我"UI高级"里面一篇文章着重讲了它,大家可以去看看
     */
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.headScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 64, 320, 40)];
    self.headScrollView.backgroundColor = [UIColor purpleColor];
    self.headScrollView.contentSize = CGSizeMake(560, 0);
    self.headScrollView.bounces = NO;
    self.headScrollView.pagingEnabled = YES;
    [self.view addSubview:self.headScrollView];
    for (int i = 0; i < [self.headArray count]; i++) {
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
        button.frame = CGRectMake(0 + i*80, 0, 80, 40);
        [button setTitle:[self.headArray objectAtIndex:i] forState:UIControlStateNormal];
        button.tag = i + 100;
        [button addTarget:self action:@selector(didClickHeadButtonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.headScrollView addSubview:button];
        
    }
    
    /*
     苹果新的API增加了addChildViewController方法,并且希望我们在使用addSubview时,同时调用[self addChildViewController:child]方法将sub view对应的viewController也加到当前ViewController的管理中。
     对于那些当前暂时不需要显示的subview,只通过addChildViewController把subViewController加进去;需要显示时再调用transitionFromViewController方法。将其添加进入底层的ViewController中。
     这样做的好处:
     
     1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
     2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
     3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
     */
    
    /**
     *  在iOS5中,ViewController中新添加了下面几个方法:
     *  addChildViewController:
     *  removeFromParentViewController
     *  transitionFromViewController:toViewController:duration:options:animations:completion:
     *  willMoveToParentViewController:
     *  didMoveToParentViewController:
     */
    self.firstVC = [[HMTFirstViewController alloc] init];
    [self.firstVC.view setFrame:CGRectMake(0, 104, 320, 464)];
    [self addChildViewController:_firstVC];
    
    self.secondVC = [[HMTSecondViewController alloc] init];
    [self.secondVC.view setFrame:CGRectMake(0, 104, 320, 464)];
    
    self.thirdVC = [[HMTThirdViewController alloc] init];
    [self.thirdVC.view setFrame:CGRectMake(0, 104, 320, 464)];
    
    //  默认,第一个视图(你会发现,全程就这一个用了addSubview)
    [self.view addSubview:self.firstVC.view];
    self.currentVC = self.firstVC;
    
}

- (void)didClickHeadButtonAction:(UIButton *)button
{
    //  点击处于当前页面的按钮,直接跳出
    if ((self.currentVC == self.firstVC && button.tag == 100)||(self.currentVC == self.secondVC && button.tag == 101.)) {
        return;
    }else{
    
        //  展示2个,其余一样,自行补全噢
        switch (button.tag) {
            case 100:
                [self replaceController:self.currentVC newController:self.firstVC];
                break;
            case 101:
                [self replaceController:self.currentVC newController:self.secondVC];
                break;
            case 102:
                //.......
                break;
            case 103:
                //.......
                break;
            case 104:
                //.......
                break;
            case 105:
                //.......
                break;
            case 106:
                //.......
                break;
                //.......
            default:
                break;
        }
    }

}

//  切换各个标签内容
- (void)replaceController:(UIViewController *)oldController newController:(UIViewController *)newController
{
    /**
     *            着重介绍一下它
     *  transitionFromViewController:toViewController:duration:options:animations:completion:
     *  fromViewController      当前显示在父视图控制器中的子视图控制器
     *  toViewController        将要显示的姿势图控制器
     *  duration                动画时间(这个属性,old friend 了 O(∩_∩)O)
     *  options                 动画效果(渐变,从下往上等等,具体查看API)
     *  animations              转换过程中得动画
     *  completion              转换完成
     */
    
    [self addChildViewController:newController];
    [self transitionFromViewController:oldController toViewController:newController duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:nil completion:^(BOOL finished) {
                
        if (finished) {
                    
            [newController didMoveToParentViewController:self];
            [oldController willMoveToParentViewController:nil];
            [oldController removeFromParentViewController];
            self.currentVC = newController;
                
        }else{
                    
            self.currentVC = oldController;
                
        }
    }];
}

 

ChildViewController

标签:

原文地址:http://www.cnblogs.com/coderMJL/p/5058488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!