zoukankan      html  css  js  c++  java
  • iOS基础-UIKit框架-多控制器管理-UINavigationController、控制器的生命周期

    一、导航控制器基本使用


    1.创建一个空项目,创建导航控制器nav,设置导航控制器为Window的根控制器
    2.新建3个控制器类管理这3个View(勾上also create xib),在xib中添加一个标签用来注明是第几个控制器,添加一个按钮用来跳转到下一个控制器
    3.创建第一个控制器并添加到导航控制器中

    [nav pushViewController:one animated:YES];

    4.监听用来跳转到第二个的按钮并实现方法

    -(IBAction)jump2Two:(id)sender{
    //1.创建第二个控制器
    //2.将第二个控制器添加到导航控制器中
    //只要当前控制器是导航控制器的子控制器,就可以通过该属性直接获取到当前控制器所在的导航控制器
    [self.navigationController pushViewController:two animated:YES];
    }

    5.监听第二个子控制器上的跳转到第三个的按钮并实现该方法。

    -(IBAction)jump2Three:(id)sender
    
    {
    //1.创建第三个控制器
    //2.将第三个控制器添加到导航控制器中
    [self.navigationController pushViewController:three animated:YES];
    }

    二、导航控制器的管理
    导航控制器是通过栈的形式来管理子控制器的(先进后出类似羽毛球桶)
    导航控制器的view结构
    ====>
    创建One控制器(被放到导航控制器的栈中)-->自动创建One控制器的View并放到导航控制器的View之上。

    再创建Two控制器(被放到导航控制器的栈中)-->自动创建Two控制器的View并将One控制器的View推开,所以显示的是Two控制器的View,

    注意:此时One的View并没有销毁
    =====>
    再创建Three控制器(被放到导航控制器的栈中)-->自动创建Three控制器的View并将Two控制器的View推开,所以显示的是Three控制器的View,注意:此时One的View和Two的View并没有销毁

    PS:显示在导航控制器上的view永远是栈顶控制器的view

    当点击back时,就会将Three控制器从导航控制器的栈中移除并销毁,同时Three控制器的View也被销毁,此时栈顶控制器由Three控制器变为Two控制器,所以现在屏幕上显示的是Two控制器的View,
    再点击back时,就会将Two控制器从导航控制器的栈中移除并销毁,同时Two控制器的View也被销毁,此时栈顶控制器由Two控制器变为One控制器,所以现在屏幕上显示的是One控制器的View

    //导航控制器的栈
    nav.viewControllers;==nav.childViewControllers;
    
    *往栈内添加子控制器的三种方式
    //第一种
    [nav pushViewController:one animated:YES];
    //第二种
    [nav addChildViewController:one];
    //第三种:给导航控制器的栈直接赋值(不能使用childViewControllers[只读])
    nav.viewControllers = @[one];
    //第四种(最常用的方式)
    UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:one];
    
    //获取栈顶控制器
    nav.topViewController;

    *功能实现:在第三个控制器View上添加按钮,点击后回到第二个控制器View
    来到第三个控制器的xib,在上面添加一个按钮,监听点击,实现方法

    -(IBAction)back2Two:(id)sender
    
    {
      //移除当前栈顶的控制器
      [self.navigationcontroller popViewControllerAnimated:YES];
    }

    *功能实现:在第三个控制器View上添加按钮,点击后回到第一个控制器View
    来到第三个控制器的xib,在上面添加一个按钮,监听点击,实现方法

    -(IBAction)back2Root:(id)sender
    
    {
      //移除除了栈底控制器之外的所有控制器
      [self.navigationcontroller popToRootControllerAnimated:YES];
    }

    知识扩展:

    //只要传入栈中的某一个控制器,就会跳转到指定控制器
    [self.navigationcontroller popToViewController:XXX Animated:YES];

    ***在导航条上添加内容***
    一个导航控制器只有一个导航条,即所有的子控制器共用同一个导航条。导航条上显示的内容和栈顶控制器有关,所以导航条上显示什么内容由栈顶控制器控制。 
    注意:导航条显示内容的特例:导航条上的返回按钮的文字由上一个控制器决定
    来到第一个控制器

    -(void)viewDidLoad
    {
      [super viewDidLoad];
    //控制当前控制器对应的导航条显示的内容
    self.navigationItem.title = @"第一个控制器"//给导航条添加一个按钮(right同理)
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil  
    action:nil];
    //修改返回按钮显示的内容(在第一个控制器设置,在第二个控制器view显示)
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@”返回“ style:UIBarButtonItemStylePlain target:nil  action:nil];
    }

    技巧:以后要打印什么的时候在applicationDidBecomeActive:方法(已经可以和用户交互)里打印,而不是在didFinishLaunchingWithOptions:方法中打印

    三、导航控制器storyboard

    1.来到storyboard,删除默认View,添加一个导航控制器,将默认的根控制器删除
    2.拖一个View Controller,将其设置为导航控制器的根控制器
    3.再拖一个View Controller,在根控制器上添加一个按钮,以这个按钮为起点连一个push型Segue到刚拖的View Controller上。
    4.再重复一次第三步。
    5.点击导航条,即可修改标题,返回键等内容。

    storyboard弊端:在第三个View上添加一个按钮,点击后回到第二个View。这个功能不能用storyboard实现。只能用代码实现
    1>自定义一个类来管理第三个View,并将storyboard的第三个View的Class设置为这个自定义类
    2>监听"返回第二个控制器"的按钮,并实现方法

    -(IBAction)back2Two:(id)sender
    
    {
        [self.navigationController PopViewControllerAnimated:YES];
    }

    四、控制器的生命周期

    //当控制器的view加载完毕就调用
    -(void)viewDidLoad
    {
    [super viewDidLoad];
    }
    
    //控制器的view即将显示的时候调用
    -(void)viewWillAppear:(BOOL)animated
    {
    [super viewWillAppear:YES];
    }
    
    //控制器的view完全显示的时候调用
    -(void)viewDidAppear:(BOOL)animated
    {
    [super viewDidAppear:animated];
    }
    
    //控制器的view即将消失的时候调用
    -(void)viewWillDisappear:(BOOL)animated
    {
    [super viewWillDisappear:animated];
    }
    
    //控制器的view完全消失的时候调用
    -(void)viewDidDisappear:(BOOL)animated
    {
    [super viewDidDisappear:animated];
    }
    
    
    //上面的方法没什么技术含量,下面的方法面试中会问到(虽然已经过时)
    /*
    //控制器的view即将销毁的时候调用
    -(void)viewWillUnload
    {
    [super viewWillUnload];
    }
    
    //控制器的view完全销毁的时候调用
    -(void)viewDidUnload
    {
    [super viewDidUnload];
    //清空不需要的属性
    self.foods = nil;
    }
    
    //接收到内存警告的时候调用
    -(void)didReceiveMemoryWarning
    {
    //按照父类的处理方式去处理内存警告
    [super didReceiveMemoryWarning];
    }
    */

    系统是如何处理内存警告的?

    Q:系统如何判断View是否能销毁?
    A:看你这个View是否在Window上。

    上述方法其实是一个循环

  • 相关阅读:
    L3-013. 非常弹的球
    L2-020. 功夫传人
    L1-039. 古风排版
    Innobackup备份过程
    MySQL物理备份的过程
    数据库表设计
    MySQL启动排错
    redo的类型和作用
    描述undo的三个作用
    redo log和binlog的纠缠
  • 原文地址:https://www.cnblogs.com/marshall-yin/p/4728442.html
Copyright © 2011-2022 走看看