关于ios导航控制器的知识总结
关于ios导航控制器的知识总结
添加了导航控制器后:
1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性。且导航栏默认是不隐藏的,而底部工具栏默认是隐藏的。
2.可以通过设置 self.navigationController.toolbarHidden = NO来显示底部工具栏,工具栏中的内容可以通过viewController的toolbarItems来设置,显示的顺序和设置的NSArray中存放的顺序一致,其中每一个数据都一个UIBarButtonItem对象。
3.导航控制器的导航栏navigationbar和工具栏toolbar上的导航按钮是由导航栈栈顶视图控制器(navC.topViewController,即当前显示在屏幕上vc)的navigationItem和toolbarItems属性来设置(猜想:苹果在UIViewController.h中增加navigationItem模型属性,在vc.navigationItem.title方法的内部实现,肯定是调用了vc.navigationController.navigationBar.titleLabel.text来设置的)。
注意:以后凡是看到系统自带的类xxxItem,肯定是苹果封装好的Model模型,它并不是UI控件,而是继承自NSObject的模型。例如:navigationItem是用来给navigationBar提供显示数据的模型,UIBarButtonItem是用来给UINavigationItem提供数据的模型,他们是继承自NSObject的模型,并不是UI控件。
4. 下一个页面的左侧Back按钮的名称是由上一个控制器backBarButtonItem来设置的。只能设置名称,不能设置形状。如果下个VC设置了leftBarButtonItem,则本页面设置backBarButtonItem无效,会被下个页面的左按钮覆盖掉。如果上一页面没有设置backBarButtonItem按钮的名称,则默认显示为Back。但是若上页面有设置navigationItem.title属性,则显示该title。如果上一页面设置的是navigationItem.titleView,则下一页面左侧仍显示默认的Back.
5.导航控制器会有一个viewControllers属性,其中的VC是以栈的形式组织的,当pushViewController或者addChildViewController或者直接添加到数组navC2.viewControllers = @[vc1,vc2,vc3]; 因为会新出现一个页面,在push,add之前需要创建好对应VC的对象。当使用popToViewController时,栈顶的VC都会被销毁(如不想被销毁,需给它一个强引用即可),pop返回到的那一页的VC的对象不需要新创建,因为之前使用push把它压入导航栈,被导航控制器的viewControllers数组强引用,一直都不会被销毁,直到被pop出去才会销毁。
6.导航控制器的栈底控制器(navC.rootViewController) 永远不会销毁,除非导航控制器被销毁。导航控制器的navigationbar和工toolbar上的按钮是由栈顶视图控制器(navC.topViewController,即当前显示在屏幕上vc)的navigationItem和toolbarItems来设置。
7.导航控制器工作原理:导航控制器创建时便传入一个rootViewController,其内部肯定是调用[navC pushViewController: rootVC]; 来实现的。而pushViewController:方法内部会首先将rootVC加入到navC.viewControllers(childViewControllers)中,成为该数组的第一个元素。然后创建rootVC.view,并添加到导航控制器的view上(即:[navC.view addSubview:vc.view];),然后显示在屏幕上。 rootVC.view被直接加到navC.view上,是没有动画的,以后push进导航控制器的vc.view在加到navC.view上时,都会有动画的。
8.导航控制器是如何处理界面跳转的?
首先,rootVC被加入到navC.viewControllers数组,成为navC的第1个子控制器;同时,rootVC.view被加到navC.view上,没有动画。
第二,rootVC中调用[self.navigationController pushViewController: twoVC];方法后,内部做法是:将twoVC加入navC.viewControllers数组,成为navC的第2子控制器,然后创建twoVC.view并addSubview到navC.view.subviews数组的最上面。 然后利用动画将rootVC.view向左移出屏幕,将twoVC.view移入屏幕,等rootVC.view向左完全移出屏幕,此时调用[rootVC.view removeFromSuperview]; 因为rootVC仍然存在于navC.viewControllers数组中(仍是第一个元素),rootVC.view虽然从父视图navC.view上移除,但还有rootVC对它的强引用,所以rootVC.view并不会被销毁,仍然存活在堆内存中。
第三,当点击屏幕上的twoVC.view的“返回”按钮,触发[self popViewController];方法,首先将twoVC从navC.viewControllers数组中移除(移出数组后twoVC无强引用,立即销毁),然后调用[navC.view addSubView:rootVC.view]将根视图加到navC.view.subviews数组的最上面,然后通过动画,将twoVC.view向右移出,将rootVC.view慢慢向右移入,等twoVC.view完全移出屏幕,调用[twoVC.view removeFromSuperview]; 此时twoVC.view因无强引用,就会立刻销毁。
9.突然想明白一个一直很疑惑的问题:在storyboard中_window的根视图控制器是navC,然后navC的根视图控制器是OneVC,点击OneVC顶部导航栏上右边的按钮,按住control键拖到TwoVC设置跳转时,既可以使用push,也可以使用modal,以前一直被这种假象误导,以为导航控制器既能push,也能modal出一个新的控制器。经过这几天的学习,明白了只要是个VC, 无论它有没有导航控制器,它都能modal出一个新的视图控制器。其实上面的TwoVC仅仅是OneVC控制器modal出来的一个视图控制器而已,它跟navC没有任何关系,不在navC的viewControllers数组中。
10. 关于modal控制器的用法,可参考: http://www.cnblogs.com/wendingding/p/3778853.html
关于NavigationController的优秀博文,可参考: 《iOS开发UI篇—多控制器和导航控制器简单介绍》、《IOS开发UI篇—导航控制器属性和基本使用》、
文章系作者原创,转载请注明出处:http://www.cnblogs.com/stevenwuzheng/p/5397040.html
如有错误,欢迎随时指正!
关于ios导航控制器的知识总结的更多相关文章
- iOS导航控制器常用函数与navigationBar常用属性
导航控制器常用函数触发时机 当视图控制器的View将要出现时触发 - (void)viewWillAppear:(BOOL)animated 当视图控制器的View已经出现时触发 - (void)vi ...
- 关于iOS导航控制器隐藏和显示会出现返回键失效,导航栏标题动画异常
最近做的demo bug出现了,我觉得这个bug出现得很经典所以贴出来给大家看看, bug演示就是:点击返回键失效出现如下gif图演示的内容 为啥会出现如此奇葩的bug,系统的返回键居然失效了,尴尬 ...
- iOS 导航控制器返回栈中的某一控制器
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- iOS - 导航控制器
1.导航控制器 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.bac ...
- iOS 导航控制器如何随意push和pop 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A
这里主要是对导航控制器的viewControllerss这个数组进行操作,因为push操作和pop操作都是根据这个数据去切换控制器或者在这个数组里增加控制器的,所以只要改变这个子控制器数据就能自定义切 ...
- IOS 导航控制器基本使用(UINavigationController代码创建方式)
● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...
- 【Demo 0007】导航控制器
本章学习要点 1. 了解导航控制器基本知识: 2. 掌握导航控制器基本用法: 3. 掌握导航控制器基本用法;
- iOS开发UINavigation——导航控制器UINavigationController
iOS开发UINavigation系列一——导航栏UINavigtionBar摘要iOS中的导航条可以附着于导航控制器之中使用,也可以在controller中单独使用,这篇博客,主要讨论有关导航栏的使 ...
- iOS开发UI篇—多控制器和导航控制器简单介绍
iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...
随机推荐
- android之dialog
先编写activity_main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...
- [转]IE11下Forms身份认证无法保存Cookie的问题
本文转自:http://www.cnblogs.com/jaxu/p/3698377.html ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加au ...
- BZOJ 1051 受欢迎的牛(Tarjan缩点)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4573 Solved: 2428 [Submit][S ...
- Spring+Mybatis+MySql+Maven 简单的事务管理案例
利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...
- lua5.2版本在VS2010下的环境搭建
第一次使用脚本语言,第一次使用解释性语言 公司的现在维护的游戏开发的比较早,采用的lua还是比较早的版本,像NPC脚本系统就是使用lua+luabind结合的module模式,服务器端没涉及到,所以不 ...
- DOS实用命令/工具
winver 检查Windows版本wmimgmt.msc 打开windows管理体系结构wupdmgr windows更新程序wscript windows脚本宿主设置write 写字板w ...
- MemcacheQ安装及使用
一.MemcacheQ安装记录1.安装libevent查看是否已经安装了libeventrpm -qa|grep libevent如果没有安装使用yum安装yum install libevent l ...
- [Android] Intent详解
[转]http://www.cnblogs.com/engine1984/p/4146621.html [正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重 ...
- 【】五句话搞定JavaScript作用域
JavaScript的作用域一直以来是前端开发中比较难以理解的知识点,对于JavaScript的作用域主要记住几句话,走遍天下都不怕... 一.“JavaScript中无块级作用域” 在Java或C# ...
- yii2 rbac-plus的使用
前言 1.本教程适合有RBAC基础,对RBAC有一定了解的同学. 2.本教程使用advanced模板 3.确保数据库中存在user表,没有的同学请查阅文档 运行 php yii migrate 来生成 ...