关于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 ...
随机推荐
- Jquery - Select 和 Checkbox 、Textarea的操作
Checkbox //判断是否选中 if ($(this).is(':checked')) { alert("它处于选中状态"); } else { alert("它不处 ...
- Acronis True Image Home 2011 PXE服务器配置_qxxz_新浪博客
想实现网络启动,并且Acronis启动菜单中带有Acronis True Image Home,需要安装以下软件: 1.安装Acronis True Image Home 2011及plush pac ...
- poj 3253 初涉二叉堆 模板题
这道题很久以前就做过了 当时是百度学习了优先队列 后来发现其实还有个用sort的办法 就是默认sort排序后 a[i]+=a[i-1] 然后sort(a+i,a+i+n) (大概可以这样...答案忘了 ...
- mysql insert一条记录后怎样返回创建记录的主键id,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- PHP自动加载__autoload的工作机制
PHP自动加载__autoload的工作机制 PHP的懒加载lazy loading 在 2011年11月12日 那天写的 已经有 4559 次阅读了 感谢 参考或原文 服务器君一共花费了 ...
- ADO 事务
Ado.Net事务处理.在ADO.NET 中,可以使用Connection 和Transaction 对象来控制事务.若要执行事务,请执行下列操作:• 调用Connection 对象的BeginTra ...
- mysql备份恢复
备份命令: mysqldump -u root -p --opt 数据库名 > /data/数据库文件名.sql 恢复命令: mysql -u root -p 数据库名</data/恢复的 ...
- find principles
Computer Science An Overview _J. Glenn Brookshear _11th Edition In this chapter we explore the probl ...
- Windows注册表(持续更新)
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Zoom 下, 设置DWORD 值 ZoomDisabled 等于 1.
- MessageQueue 一 简单的创建和读取
创建一个队列,并写入数据 在读取出来 using System; using System.Collections.Generic; using System.Linq; using System.M ...