IOS的控制器
控制器简单来说,就是用来做界面跳转的,类似于 Android 的Intent
1.创建一个控制器
控制器的常见的创建方式 )通过storyboard创建 //直接创建
NJViewController *nj = [[NJViewController alloc]init]; //指定xib文件
NJViewcontroller *nj = [[NJViewController alloc]
initWithNibName:@"NJViewController" bundle:nil]; //先加载storyboard文件(Test是stroyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil]; 接着初始化storyboard中的控制器
初始化"初始控制器"(箭头所指的控制器)
NJViewController *nj = [storyboard instantiateInitialViewController]; 通过一个标识初始化对应的控制器
NJViewController *nj=[storyboard instantiateViewControllerWithIdentifier:@"nj"];
MJViewController的view的创建图

控制器的加载
.控制器的view是延迟加载的,用到时再加载
.可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
.控制器的view加载完毕就会调用viewDidLoad方法
多控制器
.一个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
.设置UIWindow的rootViewController为UINavigationController
.根据具体情况,通过push方法添加对应个数的子控制器 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 *)popToRootViewControolerAnimated:(BOOL) animated;
修改导航栏的内容
导航栏的内容由栈顶控制器的navigationitem属性决定 UINavigationItem有以下属性影响着导航栏的内容
//左上角的返回按钮
@property(nonatomic,retain)UIBarButtonItem *backBarButtonItem;
//中间的标题视图
@property(nonatomic, retain)UIView *titleView;
//中间的标题文字
@property(nonatomic,copy) NSString *title;
//左上角的视图
@property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;
//UIBarButtonItem *rightBarButtonItem 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
Segue
Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)

Segue的属性
每一个segue对象,都有3个属性
//唯一标识
@property(nonatomic, readonly) NSString *identifier;
//来源控制器
@property(nonatomic,readonly) id sourceViewController;
//目标控制器
@property(nonatomic,readonly) id destinationViewController;

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

手动型:

performSegueWithldentifier:sender:
利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转
接下来研究performSegueWithIdentifier:sender:方法的完整执行过程
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
//这个self是来源控制器
1.根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
设置Segue对象的sourceViewController(来源控制器)
新建并且设置Segue

.调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender: (id) sender; //这个sender是当初performSegueWithIdentifier:sender:中传入的sender .调用Segude对象的-(void)perform;方法开始执行界面跳转操作 取得sourceViewController所在的UINavigationController 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转 [self performSegueWithIdentifier:@"login2contacts" sender:@"jack"]; -(void)perpareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
控制器的数据传递
控制器之间的数据传递主要有两种情况:顺传和逆传
顺传
控制器的跳转方向:A-->C
数据的传递方向: A--->C
数据的传递方式: 在A的 perpareForSeque:sender 方法中根据segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递数据
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
逆传
控制器的跳转方向:A -->C
数据的传递方向: C-->A
数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A
IOS的控制器的更多相关文章
- iOS 视图控制器转场详解
iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...
- iOS视图控制器的生命周期
今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...
- 关于ios导航控制器的知识总结
关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...
- iOS中控制器的释放问题
iOS中控制器的释放问题 ARC工程是可以重写dealloc方法并被系统调用的,但不需要手动调用父类的dealloc,手写[super dealloc]方法会报错,事实上系统会自动帮你调用父类的dea ...
- iOS 容器控制器 (Container View Controller)
iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...
- iOS(视图控制器转场)
转场需要提供转场代理,不使用默认的代理则需要自己实现代理方式,有UINavigationController.UITabBarController.UIViewController三种代理,实现以下三 ...
- iOS,视图控制器相关(UIViewController)
1.视图控制器各个方法调用时机 2.选项卡(Tab Bar)和导航栏(Navigation Bar) 3.有无控制器的页面跳转 4.页面跳转隐藏底部选项卡 5.获取导航栏和状态栏高度,隐藏导航栏返回按 ...
- iOS:控制器间的数据传递
在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...
- iOS开发——控制器OC篇&UINavigationController&UITabBarController详解
UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationControl ...
- 笔记-iOS 视图控制器转场详解(上)
这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...
随机推荐
- 当git上文件大小写重命名的修改时(git大小写敏感/默认不敏感),如何提交
git默认是大小写不敏感!!! 加了感叹号是什么意思呢,意思就是这本身就是一个坑,本人使用的IDE是idea(网上说Eclipse可以避开问题),这个IDE本身就集成了git,但是如果要在termin ...
- ABC: Always Be Coding
ABC: Always Be Coding (原地址:https://medium.com/@davidbyttow/abc-always-be-coding-d5f8051afce2) Be h ...
- Vim快速入门
学习自:实验楼 Vim具有6种基本模式和5种派生模式 普通模式: vim启动后的默认模式,常用的编辑器命令诸如移动光标,删除文本. 普通模式中,有很多方法进入插入模式,常用 a 或 i 键. 插入模式 ...
- 在TFS中通过程序动态创建Bug并感知Bug解决状态
为便于跟踪问题解决情况,预警引擎产生的比较严重的预警日志,需要在TFS中登记Bug,通过TFS的状态流转,利用TFS Bug的Web挂钩功能,动态感知Bug解决状态,从而跟踪预警问题的解决状态, 整体 ...
- win32 htmlayout点击按钮创建新窗口,以及按钮图片样式
最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- Object-C开发常用宏定义
Object-C开发中宏会将经常用到的系统常量进行封装,方便使用: 1.获取通知中心 #define EYNotificationCenter(name, object, userInfo) [[NS ...
- vagrant up 失败解决办法
前几天在自己电脑搭建vagrant环境报错:"There was an error while executing `VBoxManage`, a CLI used by Vagrant f ...
- 老李分享:接电话之uiautomator 1
老李分享:接电话之uiautomator poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9 ...
- LoadRunner性能测试专项班隆重开班
LoadRunner性能测试专项班隆重开班 POPTEST首届高级性能测试提升强化班开课. 也许你只是看到成功者的光鲜,却没看到他们的努力和汗水.不要否定现在,要看到未来.提高自己.怎么自己.成就自己 ...