控制器跳转

本文详细介绍了iOS开发中四种常见的界面跳转方法:UINavigationController、UITabBarController、模态展示和Storyboard通过Segue实现的跳转。针对每种方法的特点、使用场景及具体实现步骤进行了深入解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

控制器跳转有三种方法
     ①UINavigationController
     ②UITabBarController
     ③模态(modal)
     ④storyboard通过segue

一、UINavigationController(移除栈的控制器会被销毁)
     利用UINavigationController可以轻松管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用
    
     
     UINavigationController的使用步骤
         
          初始化UINavigationController
          设置UIWindow的rootViewController为UINavigationController
          根据具体情况,通过push方法添加对应个数的子控件

     UINavigationController的子控控制器

          UINavigationController以栈的形式保存子控件
          @property(nonatomic,copy)NSArray*viewControllers;
          @property(nonatomic,readonly)NSArray*childViewControllers;

          使用push方法能将某个控制器压入栈
          - (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated;

          使用pop方法可以移除控制器(移除栈的控制器会被销毁)
               移除栈顶控制器:- (UIViewController*)popViewControllerAnimated:(BOOL)animated;
               回到指定的子控制器:- (NSArray*)popToViewController:(UIViewController*)viewController animated:(BOOL)animated;
               回到栈底控制器(根控制器):- (NSArray*)popToRootViewControllerAnimated:(BOOL)animated;

     UINavigationController的view结构
         
             最终显示效果:
         

     修改导航栏的内容

          栈顶控制器的navigationItem属性决定导航栏显示内容 UINavigationItem有以下属性
     backBarButtonItem : 左上角的返回按钮
     titleView : 中间的标题视图
     title : 中间的标题文字
     leftBarButtonItem : 左上角视图
     rightBarButtonItem : 右上角视图

二、UITabBarController(控制器切换不销毁)
     跟UINavigationController类似,UITabBarController也可以轻松管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ、微信等应用
     (红色框框
    
     UITabBarController的简单使用

          初始化UITabBarController
          设置UIWindow的rootViewController为UITabBarController
          根据具体情况,通过addChildViewController方法添加对应 个数的子控制器

     UITabBarController的子控制器

          添加单个子控制器
          - (void)setViewControllers:(NSArray*)viewControllers animated:(BOOL)animated;

          设置子控制器数组
          @property(nonatomic,copy)NSArray*customizableViewControllers;

     UITabBarController的view结构
          
               最终显示效果
         

     UITabBar

          如果UITabBarcontroller有N个子控制器,那么UITabBar内部就会由N个UITabBarButton作为子控件
          如果UITabBarController有4个子控制器,那么UITabBar的结构大致如下图所示
                             


     UITabBarButton

          UITabBarButton里面显示什么内容,由对应子控制器的tabBarItem属性决定
                  
     
二、Modal(移除会销毁)
     任何控制器都能通过Modal的形式展示出来
     Modal的默认效果:新控制器从屏幕的最底部往上钻,直接盖住之前的控制器为止

     以Modal的形式展示控制器

     - (void)presentViewController:(UIViewController*)viewControllerToPresent animated: (BOOL)flag completion:(void(^)(void))completion

     关闭当初Modal出来的控制器(销毁)

     - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void(^)(void))completion

     效果图
         

四、storyboard通过segue
     Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)如下图:
    

     Segue的属性

     唯一标识
     @property (nonatomic,readonly)NSString *identifier;
     来源控制器
     @property (nonatomic,readonly)id sourceViewController;
     目标控制器
     @property (nonatomic,readonly)id destinationViewController;    
       

     Segue的类型

          根据Segue的执行(跳转)时刻,Segue可以分为2大类型
          自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
          手动型:需要通过写代码执行那Segue,才能完成界面跳转

          自动型Segue使用:
               按住Control键,直接从控件拖线到目标控制器
               
               点击“登录”按钮后,就会自动跳转到右边的控制器
               如果点击某个控件后,不需要做任何判断,一定要跳转到下一个界面,建议使用“自动型Segue”

          手动型Segue使用:
               按住Control键,从来源控制器拖线到目标控制器
               
               手动型的Segue需要设置一个标识
               
               在恰当 的时刻,使用perform方法执行对应的Segue
                    [self performSegueWithIdentifier:@"login2contacts"sender:nil];
                     Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
       如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”

     performSegueWithIdentifier:sender:

     利用performSegueWithIdentifier:sender:方法可以执行某个Segue,完成界面跳转
     上方法的完整执行过程:

          1.根据identifier去storyboard中国找到对应的线,新建UIStoryboardSegue对象
          ->设置Segue对象的sourceViewController(来源控制器)
          ->新建并且设置Segue对象的destinationViewController(目标控制器)

                        

          2.调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好得Segue对象
                         -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
                              这个sender是当初performSegueWithIdentifier:sender:中传入的sender
                              
          3.调用Segue对象的-(void)perform方法开始执行界面跳转操作
            (1)如果segue的style时push
               ->取得sourceViewController所在的UINavigationController
               ->调用UINavigationController的push方法将destinationViewController压入栈,完成跳转
            (2)如果segue的style时modal
               ->调用sourceViewController的presentViewController方法将destinationViewController展示出来

     控制器的数据传递

     控制器之间的数据传递主要有2种情况:顺传和逆传

         顺传
          控制器的跳转方向: A → C
          数据的传递方向: A → C
          数据的传递方式:在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递数据(要再C的viewDidLoad方法中取得数据,来赋值给界面上得UI控件)
         
         顺传
          控制器的跳转方向: A → C
          数据的传递方向: C → A
          数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A
          



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值