控制器简单来说,就是用来做界面跳转的,类似于 Android 的Intent

1.创建一个控制器

  1. 控制器的常见的创建方式
  2.  
  3. )通过storyboard创建
  4.  
  5. //直接创建
  6. NJViewController *nj = [[NJViewController alloc]init];
  7.  
  8. //指定xib文件
  9. NJViewcontroller *nj = [[NJViewController alloc]
  10. initWithNibName:@"NJViewController" bundle:nil];
  11.  
  12. //先加载storyboard文件(Test是stroyboard的文件名)
  13. UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
  14.  
  15. 接着初始化storyboard中的控制器
  16. 初始化"初始控制器"(箭头所指的控制器)
  17. NJViewController *nj = [storyboard instantiateInitialViewController];
  18.  
  19. 通过一个标识初始化对应的控制器
  20. NJViewController *nj=[storyboard instantiateViewControllerWithIdentifier:@"nj"];

MJViewController的view的创建图

控制器的加载

  1. .控制器的view是延迟加载的,用到时再加载
  2. .可以用isViewLoaded方法判断一个UIViewControllerview是否已经被加载
  3. .控制器的view加载完毕就会调用viewDidLoad方法

多控制器

  1. .一个iosapp很少只由一个控制器组成,除非这个app极其简单
  2. .当app中有多个控制器的时候,我们就需要对这些控制器进行管理
  3. .有多个view时,可以用一个大得view去管理1个或者多个小view
  4. .控制器也是如此,用1个控制器去管理其他多个控制器
  5.  
  6. 比如:
  7. 用一个控制器A 去管理3个控制器BCD 控制器A被称为控制器BCD "父控制器",控制器 BCD 的被称为控制器A的子控制器
  8.  
  9. 为了便于管理控制器,IOS提供了2个比较特殊的控制器
  10. UINavigationController
  11. UITabBarController

UINavigationController

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

UINavigationController的使用步骤

  1. .初始化UINavigationController
  2. .设置UIWindowrootViewControllerUINavigationController
  3. .根据具体情况,通过push方法添加对应个数的子控制器
  4.  
  5. UINavigationController以栈的形式保存子控制器
  6. @property(nonatomic,copy)NSArray *viewControllers;
  7. @property(nonatomic,readonly)NSArray *childViewControllers;
  8.  
  9. 使用push方法能将某个控制器压入栈
  10. -(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
  11.  
  12. 使用pop方法可以移除控制器
  13. //将栈顶的控制器移除
  14. -(UIViewController *)popViewControllerAnimated:(BOOL)animated;
  15. //回到指定的子控制器
  16. -(NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
  17. //回到根控制器(栈底控制器)
  18. -(NSArray *)popToRootViewControolerAnimated:(BOOL) animated;

修改导航栏的内容

  1. 导航栏的内容由栈顶控制器的navigationitem属性决定
  2.  
  3. UINavigationItem有以下属性影响着导航栏的内容
  4. //左上角的返回按钮
  5. @property(nonatomic,retain)UIBarButtonItem *backBarButtonItem;
  6. //中间的标题视图
  7. @property(nonatomic, retain)UIView *titleView;
  8. //中间的标题文字
  9. @property(nonatomic,copy) NSString *title;
  10. //左上角的视图
  11. @property(nonatomic,retain)UIBarButtonItem *leftBarButtonItem;
  12. //UIBarButtonItem *rightBarButtonItem 右上角的视图
  13. @property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;

Segue

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

Segue的属性

每一个segue对象,都有3个属性

  1. //唯一标识
  2. @property(nonatomic, readonly) NSString *identifier;
  3. //来源控制器
  4. @property(nonatomic,readonly) id sourceViewController;
  5. //目标控制器
  6. @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

  1. .调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
  2.  
  3. -(void)prepareForSegue:(UIStoryboardSegue *)segue sender: (id) sender
  4.  
  5. //这个sender是当初performSegueWithIdentifier:sender:中传入的sender
  6.  
  7. .调用Segude对象的-(void)perform;方法开始执行界面跳转操作
  8.  
  9. 取得sourceViewController所在的UINavigationController
  10.  
  11. 调用UINavigationControllerpush方法将destinationViewController压入栈中,完成跳转
  12.  
  13. [self performSegueWithIdentifier:@"login2contacts" sender:@"jack"];
  14.  
  15. -(void)perpareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

控制器的数据传递

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

顺传

  1. 控制器的跳转方向:A-->C
  2. 数据的传递方向: A--->C
  3. 数据的传递方式: A perpareForSeque:sender 方法中根据segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递数据
  4. (要在CviewDidLoad方法中取得数据,来赋值给界面上的UI控件)

逆传

  1. 控制器的跳转方向:A -->C
  2. 数据的传递方向: C-->A
  3. 数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A

IOS的控制器的更多相关文章

  1. iOS 视图控制器转场详解

    iOS 视图控制器转场详解 前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题 ...

  2. iOS视图控制器的生命周期

    今天面试有一道面试题因为回答不好,因为也不经常涉及所以有点模糊,我选择了最保守的回答,没有展开写出我对这个问题的理解. 问题:IOS 开发 loadView 和 viewDidLoad 的区别? 经过 ...

  3. 关于ios导航控制器的知识总结

    关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...

  4. iOS中控制器的释放问题

    iOS中控制器的释放问题 ARC工程是可以重写dealloc方法并被系统调用的,但不需要手动调用父类的dealloc,手写[super dealloc]方法会报错,事实上系统会自动帮你调用父类的dea ...

  5. iOS 容器控制器 (Container View Controller)

    iOS 容器控制器 (Container View Controller) 一个控制器包含其他一个或多个控制器,前者为容器控制器 (Container View Controller),后者为子控制器 ...

  6. iOS(视图控制器转场)

    转场需要提供转场代理,不使用默认的代理则需要自己实现代理方式,有UINavigationController.UITabBarController.UIViewController三种代理,实现以下三 ...

  7. iOS,视图控制器相关(UIViewController)

    1.视图控制器各个方法调用时机 2.选项卡(Tab Bar)和导航栏(Navigation Bar) 3.有无控制器的页面跳转 4.页面跳转隐藏底部选项卡 5.获取导航栏和状态栏高度,隐藏导航栏返回按 ...

  8. iOS:控制器间的数据传递

    在iOS开发中遇到的控制器间的数据传递主要有两种情况:顺传递与逆传递.顺传递是指数据的传递方向和控制器的跳转方向相同(如图1):逆传递是指数据的传递方向和控制器的跳转方向相反(如图2).这里分别介绍这 ...

  9. iOS开发——控制器OC篇&UINavigationController&UITabBarController详解

    UINavigationController&UITabBarController详解 一:UINavigationController 控制器的属性: UINavigationControl ...

  10. 笔记-iOS 视图控制器转场详解(上)

    这是一篇长文,详细讲解了视图控制器转场的方方面面,配有详细的示意图和代码,为了使得文章在微信公众号中易于阅读,seedante 辛苦将大量长篇代码用截图的方式呈现,另外作者也在 Github 上附上了 ...

随机推荐

  1. 译:Missing index DMV的 bug可能会使你失去理智---慎重看待缺失索引DMV中的信息

    注: 本文译自https://www.sqlskills.com/blogs/paul/missing-index-dmvs-bug-that-could-cost-your-sanity/ 原文作者 ...

  2. 安全超文本传输协议(HTTPS)详解

    一.概念与摘要 HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息.它使 ...

  3. 搭建ntp 时钟服务器_Linux

    一.搭建时间同步服务器1.编译安装ntp serverwget [url]http://www.eecis.udel.edu/~ntp/ntp_spool/ntp4/ntp-4.2.4p4.tar.g ...

  4. iOS 任务的依赖操作

    -(void)dependency{ /** 假设有A.B~C三个操作,要求: 1. 3个操作都异步执行 2. 操作C依赖于操作B 3. 操作B依赖于操作A */ //创建一个队列 NSOperati ...

  5. 菜鸟学IT之IP基础

    IT菜鸟,以后研究的方向是云计算,从基础的开始,这是第一篇博文.有不对的地方希望大家指正.IP是网络知识的基础,今天就开始学习IP. IP地址格式:IP地址就是"网络地址+主机地址" ...

  6. ios 添加工程依赖只能生成Generic Xcode Archive 文件原因

    问题说明:工程引用了外部类库, 默认生成的archive是 Generic Xcode Archive 格式的 无法发布和生成ipa文件. 解决处理: 1.将Build Settings->De ...

  7. 你不得不知的逻辑或(||)与(&&)非(!)

    最近重新翻开原生JS,又得到很多不同的体会,虽然现在开发框架那么多,但很多思想都还是离不开原生的基础.今天呢,我就根据自己的学习总结一下逻辑与(&&)和(逻辑或(||)和逻辑非(!). ...

  8. DOM的发展,DOM0,DOM1,DOM2,DOM3

    Documentc Object Model文档对象模型是针对XML但经过扩展用于HTML的应用程序接口(API Application programming Interface).DOM把整个界面 ...

  9. tmux鼠标配置出现错误unknown option: mode-mouse

    setw -g mode-mouse on set -g mouse-select-pane on set -g mouse-resize-pane on set -g mouse-select-wi ...

  10. MySQL Online DDL的改进与应用

        本文简析Online DDL的实现原理与使用过程注意事项.       任何DDL操作,执行者都需要预先测试或者清晰了解这个操作会给数据库带来的影响是否是在业务期间数据库的可承受范围内,尤其是 ...