1010cc时时彩标准版 > 操作系统 > 导航控制器,UIViewController的生命周期

原标题:导航控制器,UIViewController的生命周期

浏览次数:88 时间:2019-08-13

UINavigationController 导航控制器,ledcontroller控制器

一、导航视图控制器

1.管理视图控制器

2.控制视图控制器之间的跳转

3.是以压栈和出栈的形式来管理视图控制器

4.导航视图控制器必须要设置根视图控制器

5.导航是视图控制器包含UINavigationBar,而且UINAvigationBar是被每个视图控制器俩管理的

UINavigationBar包含NavigationItem(一个标题,两个按钮)

6.push压栈是要alloc新对象来显示,POP出栈是返回已经存在的对象,所以不要alloc

//初始化根视图

FirstViewController *firstViewController =[[FirstViewController alloc] init];

//创建一个导航视图控制器,并且设置其根视图控制器

UINavigationController *navigationController =[[UINavigationController  alloc] initWithRootViewController:firstViewController];

//如果使用导航视图控制器来管理视图,那么就不要使用firstViewController作为window的根视图,使用导航视图控制。因为导航视图控制器已经接管了视图

self.window.rootViewController   =navigationController;

//因为UIViewController的懒加载机制 所以必须使用其view的时候才会去调用一系列的view的创建和显示过程

//试图控制器的创建 相当于在内存创建其对象

SecondViewController *secondViewController =[[SecondViewController alloc] init];

//隐藏导航条

navigationController.navigationBar.hidden=YES;

//以压栈的形式把secondViewController放入导航视图控制器中

[self.navigationController pushViewController:secondViewController animated:YES];

//pop当前对象到上个视图

[self.navigationController popViewControllerAnimated:YES];

//pop到根试图

  [self.navigationController popToRootViewControllerAnimated:YES];

//pop指定的视图控制器

 

NSArray *array =  self.navigationController.viewControllers;

[self.navigationController popToViewController:[array objectAtIndex:0] animated:YES];

输出数组只能元素的信息(内存地址和所属类型)

NSLog(@"%@",[array objectAtIndex:0]);

输出数组中的元素个数

 NSLog(@"----->>>>>>~~~%d",[array count]);

 

二、UIBarButtonItem

//创建一个UIBarButtonItem

 UIBarButtonItem *rightBarButtonItem =[[UIBarButtonItem alloc] initWithTitle:@"

设置标题

" style:UIBarButtonItemStylePlain(设置类型) target:self(设置目标) action:@selector(btnCilck:)(绑定方法)];

//设置item 右按钮

    self.navigationItem.rightBarButtonItem =rightBarButtonItem;

三、生命周期传值

//给FirstViewController对象属性value 赋值的过程

-(void)viewWillDisappear:(BOOL)animated

{

    UITextField *textFiled =(UITextField *)[self.view viewWithTag:100];

    //获得当前导航试图控制器如包含的所有试图控制器对象

    NSArray *array = self.navigationController.viewControllers;

    //获得根试图对象

    FirstViewController *  fv =  [array  objectAtIndex:0];

    //输入框内容赋值给根试图属性

    fv.value  = textFiled.text;

    NSLog(@"我区~~~");

    [super viewWillDisappear:YES];

}

 

//使用给FirstViewController对象属性value 把值传过来

-(void)viewWillAppear:(BOOL)animated

{

    NSLog(@"我有回来了~~");

    UITextField *textFiled =(UITextField *)[self.view viewWithTag:100];

    textFiled.text =self.value;

    [super viewWillAppear:YES];

}

 四、生命周期

//loadView 和viewDidLoad只会加载一次 在一个试图控制器的生命周期中

//viewWillAppear和viewDidAppear 只要执行View显示功能就会执行

//当前试图正在加载

-(void)loadView

{

    NSLog(@"当前试图正在加载");

    [super loadView];

}

 

//当前试图加载完毕

- (void)viewDidLoad

{

    [super viewDidLoad];

NSLog(@"当前试图加载完毕");

}

//当前试图将要显示

-(void)viewWillAppear:(BOOL)animated

{

    NSLog(@"当前试图将要显示");

    [super viewWillAppear:YES];

}

 

//当前试图已经显示

-(void)viewDidAppear:(BOOL)animated

{

    NSLog(@"当前试图已经显示");

    [super viewDidAppear:YES];

}

//当前试图将要消失

-(void)viewWillDisappear:(BOOL)animated

{

    NSLog(@"---->>>当前试图将要消失");

    [super viewWillDisappear:YES];

}

//当前试图已经消失

-(void)viewDidDisappear:(BOOL)animated

{

    NSLog(@"---->>>当前试图已经消失");

    [super viewDidDisappear:YES];

}

 

//试图控制机对象被释放的时候会自动调用此方法(手动管理内存)

-(void)dealloc

{

    NSLog(@"试图控制器被释放了");

    [super dealloc];

}

//

干掉试图控制器

[干掉第二个视图控制器(最后一次返回)release];

1010cc时时彩标准版, 

 

 

 

导航控制器,ledcontroller控制器 一、导航视图控制器 1.管理视图控制器 2.控制视图控制器之间的跳转 3.是以压栈和出栈的形...

一:首先了解一下生命周期图

1010cc时时彩标准版 1

导航栏


//初始化视图控制器

//名字要一致NowViewController

NowViewController * vc = [[NowViewController alloc] init];

//导航控制器把vc设置为导航控制器的根视图

UINavigationController * Nav = [[UINavigationController alloc] initWithRootViewController:vc];

//把导航控制器赋值给当前window的跟视图以此来管理放在导航控制器上的视图(ViewController)

self.window.rootViewController = Nav;

//当前导航标题要设置在"当前"

//[vc setTitle:@"first"];


NowViewController.m

//当前导航标题要设置在"当前"

self.title=@"first";

UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, 60, 30)];

[btn setTitle:@"push" forState:UIControlStateNormal];

btn.backgroundColor= [UIColorblueColor];

btn.layer.cornerRadius= 10;

[self.view addSubview:btn];

[btn addTarget:self action:@selector(push) forControlEvents:UIControlEventTouchUpInside];

}

//视图将要出现

-(void)viewWillDisappear:(BOOL)animated {

//yes

self.navigationController.navigationBarHidden=NO;

}

//视图将要消失的方法

//-(void)viewWillDisappear:(BOOL)animated {

//    //no

//    self.navigationController.navigationBarHidden = NO;

//}

- (void)push {

//视图控制器的跳转方式:

//1.导航:压栈出栈

//2.模态:弹出消失

NowViewController1 * vc = [[NowViewController1 alloc] init];

//压栈

[self.navigationController pushViewController:vc animated:YES];

//[vc setTitle:@"second"];

}

NowViewController1.m

self.title=@"second";

//解决push的时候会有1s左右的灰色阴影

self.view.backgroundColor= [UIColor whiteColor];

//隐藏导航标题。导航栏隐藏属性如果当前页面消失的时候没有设置为no的话,那么在下一级页面也是隐藏的:解决办法:在当前页面将要消失的方法中把导航栏隐藏属性设置为no

self.navigationController.navigationBarHidden=NO;

//出栈按钮

UIButton * pop = [[UIButton alloc] initWithFrame:CGRectMake(10, 100, 60, 30)];

pop.backgroundColor= [UIColororangeColor];

[pop setTitle:@"pop" forState:UIControlStateNormal];

pop.layer.cornerRadius= 10;

[pop addTarget:self action:@selector(pop) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:pop];

UIButton * btn = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 60, 30)];

btn.backgroundColor= [UIColor orangeColor];

[btn setTitle:@"push" forState:UIControlStateNormal];

btn.layer.cornerRadius= 10;

[btn addTarget:selfaction:@selector(push) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:btn];

}

- (void)pop {

//出栈

//出栈到根视图控制器

//[self.navigationController popToRootViewControllerAnimated:YES];

//回到上一级页面:(导航中的页面)

[self.navigationController popViewControllerAnimated:YES];

}

- (void)push {

NowViewController2 * third = [[NowViewController2 alloc] init];

[self.navigationController pushViewController:third animated:YES];

}

//导航按钮

//右边

//UIBarButtonSystemItemAdd  可选按钮样式

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(rightItem)];

//赋值给导航栏

self.navigationItem.rightBarButtonItem= item;

//设置当前bar的颜色

item.tintColor= [UIColor redColor];

//左边

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:selfaction:@selector(leftItem)];

self.navigationItem.leftBarButtonItem= item1;

item1.tintColor= [UIColorredColor];

- (void)rightItem {

NSLog(@"模态");

//模态

NowViewController3 *tvc = [[NowViewController3 alloc] init];

//模态出来一个页面

//[self presentModalViewController:tvc animated:YES];  ios6.0以前使用

//弹出模态(从下往上)

[self presentViewController:tvc animated:YES completion:nil];

}

- (void)dismiss {

//模态对应的模态消失的方法

[self dismissViewControllerAnimated:YES completion:nil];

}

//设置导航栏背景色

//self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:85/225.0 green:105/225.0 blue:77/225.0 alpha:0.2];

//消除导航栏的东西

//[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:0];

//消除导航栏下的分隔线

//self.navigationController.navigationBar.shadowImage= [UIImage new];

break;

Objective-C页面消失或出现时,判断是pop还是push操作

二:UIViewController 生命周期介绍

        1.通过alloc init 分配内存,初始化controller;

        2.loadView,     loadView方法默认实现[super loadView];  如果在初始化controller时指定了xib文件名,就会根据传入的xib文件名加载对应的xib文件,如果没传xib文件名,默认会加载跟controller同名的xib文件,如果没找到相关联的xib文件,就会创建一个空白的UIView,然后赋給controller的view;

         3.viewDidLoad,   当loadView创建完view之后,此时view已经完成加载了,会调用viewDidLoad方法;一般我会在这里做界面上的初始化操作,比如添加按钮,子视图,等等;

        4.viewWillAppear,     当view在load完之后,将要显示在屏幕之前会调用这个方法,  在重写这些方法时候最好先调用一下系统的方法之后在做操作;

        5.viewDidAppear ,  当view已经在屏幕上显示出来之后,会调用这个方法;

        6.viewWillDisappear, 当view视图将要从屏幕上移除时候调用;

        7.viewDidDisappear,  当视图已经从屏幕上移除时候调用;

        8.dealloc,  view被销毁时候调用,如果是手动管理内存的话,需要释放掉之前在init和viewDidLoad中分配的内存(类似alloc,new,copy);dealloc方法不能由我们主动调用,必须等引用计数为0时候由系统调用.

        注意:viewDidUnload 在6.0之后已经废弃了。简单来说,对于iOS6,你不需要做任何以前viewDidUnload的事情,更不需要把以前viewDidUnload的代码移动到 didReceiveMemoryWarning方法中

//创建window

}

页面出现时会先后执行:

三:UIViewController 生命周期实例

          首先创建一个 ViewController,并这个页面上放一个button push到下一个页面;查看它的生命周期执行顺序

          ViewController.m中的代码:

      - (void)loadView {

            [super loadView];

            NSLog(@"%@------%s",[self class], __FUNCTION__);

       }

      - (void)viewDidLoad {

           [super viewDidLoad];

           NSLog(@"%@------%s",[self class], __FUNCTION__);

           self.view.backgroundColor = [UIColor redColor];

           self.navigationItem.leftBarButtonItem =  [[UIBarButtonItem alloc]      initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(barClick:)];

     }

    - (void)viewWillAppear:(BOOL)animated {

          [super viewWillAppear:animated];

          NSLog(@"%@------%s",[self class], __FUNCTION__);

   }

  - (void)viewDidAppear:(BOOL)animated {

          [super viewDidAppear:animated];

          NSLog(@"%@------%s",[self class], __FUNCTION__);

   }

  - (void)viewWillDisappear:(BOOL)animated {

        [super viewWillDisappear:animated];

        NSLog(@"%@------%s",[self class], __FUNCTION__);

  }

 - (void)viewDidDisappear:(BOOL)animated {

       [super viewDidDisappear:animated];

      NSLog(@"%@------%s",[self class], __FUNCTION__);

 }

#pragmamark - buttonClick

- (void)barClick:(UIBarButtonItem *)button {

       SecondViewController *VC = [[FirstViewController  alloc] init];

       [self.navigationController  pushViewController:VC animated:YES];

}

第二个控制器SecondViewController.m 代码

- (void)loadView {   

           [super loadView];   

            NSLog(@"%@------%s",[selfclass], __FUNCTION__); 

  }  

- (void)viewDidLoad {

             [super viewDidLoad];

             NSLog(@"%@------%s",[self class], __FUNCTION__);

             self.view.backgroundColor = [UIColor greenColor];

  }

// 视图将要出现时就会调用

- (void)viewWillAppear:(BOOL)animated {

            [super viewWillAppear:animated];

            NSLog(@"%@------%s",[self  class], __FUNCTION__);

 }

// 视图完全出现时就会调用

- (void)viewDidAppear:(BOOL)animated {

            [super viewDidAppear:animated];

           NSLog(@"%@------%s",[self class], __FUNCTION__);

}

// 视图将要消失会调用

- (void)viewWillDisappear:(BOOL)animated {

           [super viewWillDisappear:animated];

           NSLog(@"%@------%s",[self class], __FUNCTION__);

}

// 视图完全消失会调用

- (void)viewDidDisappear:(BOOL)animated {

           [super viewDidDisappear:animated];

            NSLog(@"%@------%s",[self class], __FUNCTION__);

}

在ViewController页面中有一个button 点击button可以push到SecondViewController 由程序运行结果可知: 当刚运行程序时按顺序依次执行:

  1. viewController  loadView

  2. viewController  viewDidLoad

  3. viewController  viewWillAppear

  4. viewController  viewDidAppear

  5. viewController viewWillDisappear

  6. SecondViewController loadView

  7. SecondViewController viewDidLoad

  8. SecondViewController viewWillAppear

  9. viewController viewDidDisappear

  10. SecondViewController viewDidappear

AppDelegate.m

iOS5ViewCtrlerSample-master.zip(21.1 KB)

- (void)viewWillDisappear:(BOOL)animated;

-(void)viewDidDisappear:(BOOL)animated;

self.window= [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

NSLog(@"生日提醒");

这两个方法;在这两个方法中进行判断消失的方式即可:

[self.window makeKeyAndVisible];

default:

这两个方法;

//20状态栏 44导航栏

NSLog(@"好友申请");

别忘了页面消失时置isPush为NO:

self.window.backgroundColor= [UIColor whiteColor];

currentViewController=thirdViewController;

-(void)viewWillAppear:(BOOL)animated

-(void)viewDidAppear:(BOOL)animated

这样写的好处:

当前的controller消失的时候回先后执行

UIViewController*oldViewController=currentViewController;

如果是push出来的页面则还会执行:

5.在MainViewController中添加三个子controller

- (void)viewWillDisappear:(BOOL)animated

{

[super viewWillDisappear:animated];

_isPush = NO;

}

}  completion:^(BOOL finished) {

- (void)viewWillDisappear:(BOOL)animated {

NSArray *viewControllers = self.navigationController.viewControllers;//获取当前的视图控制其

if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {

//当前视图控制器在栈中,故为push操作

NSLog(@"push");

} else if ([viewControllers indexOfObject:self] == NSNotFound) {

//当前视图控制器不在栈中,故为pop操作

NSLog(@"pop");

}

}

下面详细介绍一下上述效果的实现:

- (void)viewDidLoad

所以可在viewdidload里加个 isPush = YES布尔值,然后在Appear中根据isPush判断是push还是pop:

-(void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

if (_isPush) {

//push

}else{

//pop

}


}

}

下面详细介绍一下addChildViewController,一个ViewController可以添加多个子ViewController,但是这些子ViewControlle要想显示出来,需要把子controller的视图添加到父视图的相应位置r,可以通过transitionFromViewController:toViewController:duration:options:animations:completion:这个方法转换显示的子视图。同时加入相应的动画。下面以一个例子来说明这几个新方法:

}

return;

}

return YES;

currentViewController=firstViewController;

}

- (void)viewDidLoad

本文由1010cc时时彩标准版发布于操作系统,转载请注明出处:导航控制器,UIViewController的生命周期

关键词:

上一篇:1010cc时时彩标准版拒绝访问,当前标识没有对

下一篇:没有了