UINavigationController-03出栈操作

出栈操作

  • popViewControllerAnimated: 返回上一级
  • popToRootViewControllerAnimated: 返回根控制器
  • popToViewController: animated:返回到指定的子控制器

  • 通过示例,来熟悉出栈的几个方法
    • 分析
      • 层级:"红色(第1层) -->黄色(第2层)-->绿色(第3层)-->桔色(第4层)"
      • 各个层级
        • 点击"下一级控制器"按钮,- pushViewController: animated:(入栈操作)
        • 点击"控制器数量"按钮,打印navigationController - 导航控制器里面有多少子控制器!
          验证: 是否将子控制器添加到"导航控制器"里面。(入栈)
      • 绿色的控制器
        • 点击'返回上一级'按钮,返回到"黄色的控制器"
      • 桔色的控制器,
        • 点"返回指定控制器"按钮,切换到黄色控制器
        • 点"返回根控制器"按钮,切换到红色控制器

  • 示例代码
    • OneViewController - 红色控制器
      -- 下一级控制器
      - (IBAction)btnNextClick:(id)sender {
        TwoViewController *twoVC = [[TwoViewController alloc]init];
        [self.navigationController pushViewController:twoVC animated:YES];
      }
      -- 打印控制器的数量
      - (IBAction)btnNumClick:(id)sender {
        NSLog(@"self.childVC= %@",self.navigationController.childViewControllers);
      }
      
    • ThreeViewController - 绿色控制器
      -- 返回上一级控制器.-'返回黄色控制器'
      - (IBAction)btnThreeReturnClick:(id)sender {
        [self.navigationController popViewControllerAnimated:YES];
       }
      
    • FourViewController - 桔色控制器
      -- 返回到指定的控制器,'dataVC[1] -- 也就是黄色控制器'
      - (IBAction)btnReturnToClick:(id)sender {
          -- 获取导航控制器里,所有的子控制器。
          NSArray* dataVC = self.navigationController.childViewControllers;
          [self.navigationController popToViewController:dataVC[1] animated:YES];
      
       --  ❌  以下是错误示范: 
        必须是已经在导航控制器里面的子控制器,才能切换.
        新创建的控制器,无法切换,因为在导航控制器里面找不到。
        OneViewController *oneVC = [[OneViewController alloc]init];
        [self.navigationController popToViewController:oneVC animated:YES];
      }
      
      -- 返回到根目控制器
      - (IBAction)btnReturnRootClick:(id)sender {
        [self.navigationController popToRootViewControllerAnimated:YES];
      }
      
    • 注意:
      • -popToViewController: animated:返回到指定的子控制器,
        此子控制器,必须得要在childViewControllers中,否则:
        NSInternalInconsistencyException

  • 出栈做了哪些操作?
    • 销毁"导航控制器"里的子控制器
    • 注意:
      它是先将要销毁子控制器,集中在一个栈里,
      然后再删除。
    • 假设当前控制器是"桔色控制器",更加上面"层级所示"那么内部,应该是这样得.
    • 此时,点击"返回根控制器",按照一般来讲.销毁顺序:
      "桔色控制器 -->绿色控制器 -->黄色控制器", 可实际销毁顺序:
      "黄色控制器 -->绿色控制器 -->桔色控制器".这是因为:
    • 把子控制器,集中在一个栈里,然后再销毁.

你可能感兴趣的:(UINavigationController-03出栈操作)