多控制器管理:UINavigationController与UITabBarController

来源:互联网 发布:2011年十大网络流行语 编辑:程序博客网 时间:2024/05/21 10:34

       一个iOS的app很少只由一个控制器组成,除非这个app极其简单。当app中有多个控制器的时候,我们就需要对这些控制器进行管理。有多个view时,可以用一个大的view去管理1个或者多个小view。控制器也是如此,用1个控制器去管理其他多个控制器。比如,用一个控制器A去管理3个控制器B、C、D,控制器A被称为控制器B、C、D的“父控制器”,控制器B、C、D被称为控制器A的“子控制器”。为了便于管理控制器,iOS提供了2个比较特殊的控制器:UINavigationController与UITabBarController。


UINavigationController

       利用UINavigationController,可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是系统自带的“设置”应用:



UINavigationController的简单使用

UINavigationController的使用步骤:

1.初始化UINavigationController

2.设置UIWindow的rootViewController为UINavigationController

3.将第一个视图控制器设置为UINavigationController的根视图控制器

4.通过push方法新建子控制器通过

5.pop方法可以返回到上一级控制器。




UINavigationController的子控制器

UINavigationController以栈的形式保存子控制器 。

使用push方法能将某个控制器压入栈 :

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated; 


使用pop方法可以移除栈顶控制器:

1. 将栈顶的控制器移除:

 - (UIViewController *)popViewControllerAnimated:(BOOL)animated; 

2.回到指定的子控制器 :

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated; 

3.回到根控制器(栈底控制器):

 - (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;


注意:无论有多少个子控制器,一个导航控制器只有一个导航栏。导航栏的内容由栈顶控制器的navigationItem属性决定。


UINavigationController工作原理(入栈)





UINavigationController工作原理(出栈)



UITabBarController

       跟UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型例子就是QQ、微信等应用。




UITabBarController的简单使用

UITabBarController的使用步骤:

1.初始化UITabBarController

2.设置UIWindow的rootViewController为UITabBarController

3.根据具体情况,通过addChildViewController方法添加对应个数的子控制器


UITabBar

       如果UITabBarController有N个子控制器,那么UITabBar内部就会有N个UITabBarButton作为子控件。例如UITabBarController有4个子控制器,UITabBar的结构大致如下:



UITabBarButton

UITabBarButton里面显示什么内容,由对应子控制器的tabBarItem属性决定:



UITabBarController的view结构



UITabBarController工作原理








App主流UI框架结构




什么是Segue(延伸)

Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)




Segue的属性



Segue的类型

根据Segue的执行(跳转)时刻,Segue可以分为2大类型:

1.自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转。

2.手动型:需要通过写代码手动执行Segue,才能完成界面跳转。


自动型Segue

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



手动型Segue

按住Control键,从来源控制器拖线到目标控制器,如图所示:


手动型的Segue需要设置一个标识(如右图)                                         


在需要的时刻,由来源控制器执行perform方法调用对应的Segue

 [self performSegueWithIdentifier:@"login2contacts" sender:nil]; 


如果点击某个控件,需要做一些处理之后才跳转到下一个界面,建议使用“手动型Segue”


注意:从Xcode6.1下, 拖线时选择Segue的style为show, 等价于以前的push。


performSegueWithIdentifier:sender:

利用performSegueWithIdentifier:方法可以执行某个Segue,跳转界面完整执行过程如下:

[self performSegueWithIdentifier:@"login2contacts" sender:nil];

1.self是来源控制器

2.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象

3.设置Segue对象的sourceViewController(来源控制器)

4.新建并且设置Segue对象的destinationViewController(目标控制器)

5.调用sourceViewController的下面方法,做跳转前的准备工作并传入创建好的Segue对象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

提示:sender是调用performSegueWithIdentifier:sender:方法时传入的对

6.调用Segue对象的- (void)perform;方法开始执行界面跳转操作:

(1)如果segue的style是push,取得sourceViewController所在的UINavigationController,调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转;

(2)如果segue的style是modal,调用sourceViewController的presentViewController方法将destinationViewController展示出来。


Modal

除了push之外,还有另外一种控制器的切换方式,那就是Modal任何控制器都能通过Modal的形式展示出来。

Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止


以Modal的形式展示控制器:

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


关闭当初Modal出来的控制器:

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

原则:谁Modal,谁dismiss。


控制器的数据传递(顺传)

控制器的跳转方向: A  -> B

数据的传递方向: A -> B

数据的传递方式: 在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器B,直接给控制器B传递数据。在B的viewDidLoad方法中取得数据,或者利用setter方法,设置界面上的UI控件。




控制器的数据传递(逆传)

控制器的跳转方向: A-> B

数据的传递方向: B -> A

数据的传递方式: 让A成为B的代理,在B中调用A的代理方法,通过代理方法的参数传递数据给A






视图(View)的生命周期示意图





































0 0
原创粉丝点击