关于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. Java泛型总结

    1. 什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的 ...

  2. MySQL助理配置

    基本配置 你需要经常察看以下3个配置项.不然,可能很快就会出问题. innodb_buffer_pool_size:这是你安装完InnoDB后第一个应该设置的选项.缓冲池是数据和索引缓存的地方:这个值 ...

  3. velocity学习记录

    一.引入文件 静态引入:#include("./footer.vm.html") 动态引入:#parse("./header.vm.html") 说明:./为v ...

  4. visual 2008中error PRJ0003 : 生成 cmd.exe 时出错

    visual 2008中error PRJ0003 : 生成 cmd.exe 时出错”,   和vs2008 sp1没关系 解决方案:工具—>选项—>项目和解决方案—>VC++目录, ...

  5. PHP 错误与异常 笔记与总结(2)错误(Fatal)

    (接上) d.Fatal error 致命级别的错误 —— 程序终止执行 [例7]调用一个未定义的方法 <?php echo md6('dee'); echo 'continue'; 输出: ( ...

  6. PHP 开启短标签

    <?=STATIC_URL?> 让上面的语句可以正常运行,等同于下面的语句 <?php echo STATIC_URL;?> 可以在 php.ini 中找到 short_ope ...

  7. Ecshop、Discuz! 等开源产品的局限

    Ecshop.Discuz! 等开源产品的局限 记得今年年初,我初次接触Discuz!和Ecshop时,一阵阵地惊叹:成熟度这么高的产品,居然是免费的.我们这些搞传统软件开发的要怎么活?另外也奇怪,做 ...

  8. 给Android程序员的六个建议

    给Android程序员的六个建议 分类: 安卓相关2015-07-14 23:58 177人阅读 评论(0) 收藏 举报 android程序员 如果你一年前写的代码 , 在现在看来你还感觉写的很不错 ...

  9. 记录一个bug -- sprintf

    #include<iostream> #include<stdio.h> int main () { char buf[10] = {0}; sprintf(buf," ...

  10. apache安装 mod_evasive

    centos环境下安装 首先安装httpd-devel yum安装mod_evasive 配置mod_evasive: DOSHashTableSize 3097      #哈希表大小(无需修改)  ...