关于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. [转]一步一步asp.net_购物车订单与支付宝

    本文转自:http://www.cnblogs.com/mysweet/archive/2012/05/19/2508534.html 最近这几天很忙,一边忙着准备一堆课程设计(8门专业课.....伤 ...

  2. Mysql时间函数

    http://blog.sina.com.cn/s/blog_6d39dc6f0100m7eo.html mysql中函数和关键字不区分大小写.下文函数的datetime参数处既可以用时间字符串也可以 ...

  3. debug和release转载

    Debug和Release区别 转自草原和大树 VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下 ...

  4. PHP正则表达式及实例

    PHP正则表达式及实例 博客分类: Php / Pear / Mysql / Node.js 正则表达式PHPWordPressFPApache  关联: 正则表达式 去除连续空白 + 获取url + ...

  5. RT-Thread相同优先级线程的调度

    /* 静态线程的 线程堆栈*/ ]; ]; /* 静态线程的 线程控制块 */ static struct rt_thread thread_test1; static struct rt_threa ...

  6. php常用[字符串]函数

    nl2br 功能:化换行符为<br> <?php $str = "cat isn't \n dog"; $result = nl2br($str); echo $ ...

  7. What is Heterogeneous Computing?

    http://developer.amd.com/resources/heterogeneous-computing/what-is-heterogeneous-computing/ Heteroge ...

  8. w_click_twice

    var w_global_obj; var dat = new Date(); var w_golbal_count_millseconds; function w_click_twice(w_cur ...

  9. go access database demo

    package main import ( "database/sql" "fmt" _ "github.com/lib/pq" " ...

  10. AppDelegate

    一.基础知识 1) main.m指定了程序的入口点 UIApplicationMain(argc, argv,nil,NSStringFromClass([StartingPointAppDelega ...