关于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篇—导航控制器属性和基本使用》、

UINavigationController使用详解

文章系作者原创,转载请注明出处:http://www.cnblogs.com/stevenwuzheng/p/5397040.html

如有错误,欢迎随时指正!

关于ios导航控制器的知识总结的更多相关文章

  1. iOS导航控制器常用函数与navigationBar常用属性

    导航控制器常用函数触发时机 当视图控制器的View将要出现时触发 - (void)viewWillAppear:(BOOL)animated 当视图控制器的View已经出现时触发 - (void)vi ...

  2. 关于iOS导航控制器隐藏和显示会出现返回键失效,导航栏标题动画异常

    最近做的demo  bug出现了,我觉得这个bug出现得很经典所以贴出来给大家看看, bug演示就是:点击返回键失效出现如下gif图演示的内容 为啥会出现如此奇葩的bug,系统的返回键居然失效了,尴尬 ...

  3. iOS 导航控制器返回栈中的某一控制器

    #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...

  4. iOS - 导航控制器

    1.导航控制器 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; self.window.bac ...

  5. iOS 导航控制器如何随意push和pop 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop 的A

    这里主要是对导航控制器的viewControllerss这个数组进行操作,因为push操作和pop操作都是根据这个数据去切换控制器或者在这个数组里增加控制器的,所以只要改变这个子控制器数据就能自定义切 ...

  6. IOS 导航控制器基本使用(UINavigationController代码创建方式)

    ● UINavigationController的使用步骤 ➢ 初始化UINavigationController ➢ 设置UIWindow的rootViewController为UINavigati ...

  7. 【Demo 0007】导航控制器

    本章学习要点       1.  了解导航控制器基本知识:       2.  掌握导航控制器基本用法:       3.  掌握导航控制器基本用法; 

  8. iOS开发UINavigation——导航控制器UINavigationController

    iOS开发UINavigation系列一——导航栏UINavigtionBar摘要iOS中的导航条可以附着于导航控制器之中使用,也可以在controller中单独使用,这篇博客,主要讨论有关导航栏的使 ...

  9. iOS开发UI篇—多控制器和导航控制器简单介绍

    iOS开发UI篇—多控制器和导航控制器简单介绍 一.多控制器 一个iOS的app很少只由一个控制器组成,除非这个app极其简单.当app中有多个控制器的时候,我们就需要对这些控制器进行管理 有多个vi ...

随机推荐

  1. 关于javascript在作用域中的变量定义你所不知道的一些东西

    //先看一段代码 var a = 100; function test(){ alert(a); var a = 200; } test(); /* 结果:undifined 原因:js引擎在执行sc ...

  2. SecureCRT的相关问题

    1. 中文显示乱码的解决方法 2. 显示Linux中的颜色信息 3. 解决终端长时间无输入导致SSH连接中断的问题 4. 以公钥方式代替密码方式登录服务器 在SecureCRT中创建Public Ke ...

  3. PHP里用户密码的回复和管理

    1). In /etc/my.ini, add skip-grant-tables 2). mysql -u root -p            (no password required) mys ...

  4. 【转载】存储scale-up和scalce-out架构

    转自:存储scale-up和scalce-out架构 存储scale-up和scalce-out架构 Scale-up,即纵向扩展架构.从下面的拓扑图我们可见,纵向扩展是利用现有的存储系统,通过不断增 ...

  5. 使用phpstorm和xdebug实现远程调试

    使用phpstorm和xdebug实现远程调试 2012-05-23 10:06:35 vs的断点调试功能很强大有木有,能查看所有变量有木有.php调试很麻烦有木有,echo,var_dump写得你想 ...

  6. MYSQL PASSWORD()

    https://www.pythian.com/blog/hashing-algorithm-in-mysql-password-2/ SELECT PASSWORD ("this_is_a ...

  7. register instruction pointer

    Computer Science An Overview _J. Glenn Brookshear _11th Edition We have already encountered the conc ...

  8. Levenshtein distance

    https://en.wikipedia.org/wiki/Levenshtein_distance 验证码识别 图片中的二维码截取

  9. http安全篇

    一.app与服务端交互确保来源的安全 作为一个移动互联网App,天生是需要和服务器通信的.那么,服务器如何识别客户端的身份?我们如何保证数据传输过程中的安全性?要靠两个东西:使用AppKey做身份识别 ...

  10. 【git】删除某个文件的所有历史记录,批量删除远程分支

    删除git某个文件的所有历史记录 git的目的就是版本控制,记录每一个版本的变动.然而有的时候我们往往希望从版本库中彻底删除某个文件,不再显示在历史记录中.例如不小心上传了一堆错误的文件,或者不小心上 ...