多控制器管理: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)的生命周期示意图
- 多控制器管理:UINavigationController与UITabBarController
- 多控制器管理, UINavigationController
- 多控制器管理(UINavigationController)
- UINavigationController与UITabBarController
- UINavigationController与UITabBarController
- UINavigationController与UITabBarController
- UINavigationController与UITabBarController
- iOS中多控制器管理 UITabBarController
- 设计多控制器跳转管理模仿 UITabBarController
- UITabBarController与UINavigationController配合使用
- UINavigationController与UITabBarController混合使用
- UITabBarController与UINavigationController配合使用
- UITabBarController与UINavigationController配合使用
- UITabBarController与UINavigationController配合使用
- UINavigationController与UITabbarController的样式
- 多控制器-UITabBarController
- iOS中的多控制器管理(二)-UITabBarController-
- UIViewController、UINavigationController、UITabBarController,这三者里面的控制器切换的区别?
- VS2010 运行程序、批处理指令
- 计算匹配字符串的个数
- Protobuf改subset模式缺少dll问题
- 老老实实做站 首页自然回归第一
- strong与weak的区别
- 多控制器管理:UINavigationController与UITabBarController
- JAVA并发处理经验(四)并行模式与算法5:并行排序模式-奇偶性排序
- 线程间的通信
- linux 下使用sim900打电话发短信
- 如何总结和整理学术文献
- LCA 模板
- POJ1860(Currency Exchange)(Bellman-Ford)
- 283. Move Zeroes
- GalleryFinal——eclipse版