为了了解底层,首先不基于UIWindow而基于UIWindow来创建App。

由于Xcode6没有以前的基于UIWindow的空项目,所以选择SingleView,然后删除storyboard,移除BuildSettings里面的main Interface。

然后在AppDelegate中初始化一个窗口交给成员变量。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES;
}

然后新建导航控制器,使用步骤为:

1.新建和初始化NavigationController

2.将UIWindow的rootViewController设置为UINavigationController

3.使用push方法添加UIView

管理UIView顺序的是栈,当栈内UIView超过1个时,会显示一个和栈顶下面一个UIView标题名相同的返回按钮,通过点击可以让当前UIView出栈,则新的UIView成为栈顶UIView,每次只显示栈顶的UIView,如果没有UIView,则只显示UIWindow和NavigationController。

例如下面的程序将两个UIView push到栈中,先显示最后面push进去的UIView。

Tip:显示的内容永远是栈顶控制器。

新建视图控制器时,只需要新建相应的控制器类,即可实现UIView和UIViewController的绑定。

    UINavigationController *nav = [[UINavigationController alloc] init];

    self.window.rootViewController = nav;

    UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor grayColor];
[nav pushViewController:vc1 animated:YES]; UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor purpleColor];
[nav pushViewController:vc2 animated:YES];

通过UIViewController拿到NavigationController的方法:

[self.navigationController pushViewController:someController animated:YES];

弹出的方法:弹出一个

[self.navigationController popToRootViewControllerAnimated:YES];

弹出到某个控制器为止,缺点是需要拿到控制器

[self.navigationController popToViewController: animated:YES];

弹出到栈底控制器:

[self.navigationController popToRootViewControllerAnimated:YES];

Tip:导航条所占高度为44,上面的StatusBar所占高度为20,因此视图应该从64开始布置。

Tip:push和pop操作不会新建导航栏,所有UIView共用一个导航栏,通过navigationItem来控制显示的内容。

通过navigationItem.title可以设置标题。

通过navigationItem.titleView可以设定标题的UIView。

通过修改leftBarButtonItem和rightBarButtonItem可以修改左右侧的视图。

Tip:由于左上角往往是导航按钮,因此不要轻易修改左边按钮。

如果添加多个UIView到导航栏,修改BarButtonItems属性即可,传入一个NSArray,UIView会按照在数组中的顺序从左到右排列。

一个细节:栈顶下面Title过长时导航栏的返回按钮会很长很难看,应该更换为“<返回”。

注意,左上角的NavigationItem(导航按钮)是由栈顶下方的控制器(上一个控制器)决定的,应该通过下面的方法控制:

注意修改的是下一个页码的返回按钮文字。

vc1.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];

Tip:在iOS6中,UIWindow高度为480,导航控制器的View高度为460,栈顶控制器高度只剩下460-44=416的高度。

利用stroyboard导航:

两种建立方式,第一种是直接新建一个NagivationController,然后再建立相应的View,通过Nagivation拖线过去,选择rootViewController方式来建立联系。

第二种是选中一个View,然后如下图这样选择:

跳转可以拖线,选择push方式。

Tip:千万不要拖往回的线,这样会创建一个新的控制器,返回应该通过pop方法。

可以不通过代码修改back按钮等内容:

(三十四)NavigationController初步的更多相关文章

  1. COJ966 WZJ的数据结构(负三十四)

    WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u  ...

  2. NeHe OpenGL教程 第三十四课:地形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

  4. Java进阶(三十四)Integer与int的种种比较你知道多少?

    Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...

  5. Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  6. SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关

    开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...

  7. spring boot 常见三十四问

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  8. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息

    第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...

  10. “全栈2019”Java第三十四章:可变参数列表

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

随机推荐

  1. let 和 const 命令

    let 命令 基本用法 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a / ...

  2. Bootstrap3 代码-内联代码

    通过 <code> 标签包裹内联样式的代码片段. For example, <section> should be wrapped as inline. For example ...

  3. JFinal中使用QuartzPlugin报ClassCastException解决方法

    JDK1.8中泛型反射修改对旧版本的影响 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 问题复现环境: JDK1.8 JFinal1.9 quart ...

  4. 利用QrCode.Net生成二维码 asp.net mvc c#

    利用QrCode.Net生成二维码 asp.net mvc c# 里面介绍了.net的方式及js的方式,还不错. 里面用到的qrcode.net的类库下载地址:https://qrcodenet.co ...

  5. 如何获得Android手机的软件安装列表

    Android的PackageManager类用于检索目前安装在设备上的应用软件包的信息.你可以通过调用getpackagemanager()得到PackageManager类的一个实例.对查询和操作 ...

  6. Mybatis源码分析--返回值ResultType和ResultMap

    这一篇博客我们来介绍一下Mybatis执行sql语句返回的结果值的到实体对象的映射机制.首先ResultType和ResultMap的使用方式是不同的. ResultType的使用方式: result ...

  7. 将meteor部署到自己的服务器(deploy meteor to your own server)

    安装指定版本的node # 所有版本在:https://nodejs.org/download/release/# current dir:/rootwget -c https://nodejs.or ...

  8. 【BAT经典算法面试题系列】求和为n的连续正整数

    马上就要到9月份了,意味着一年一度的秋招就要开始了,相信不论是正在实习的童鞋还是马上就要找工作的童鞋,BAT无疑是国内的"明星企业",是每个学计算机的小伙伴们心之向往的企业,但是呢 ...

  9. FORM当前状态分析

     变量  SYSTEM.RECORD_STATUS 确定当前记录状态.有四种返回值:CHANGED表示记录从数据库取来,并且该记录至少一个基表列被更新:INSERT表示给一个非取自数据库记录的基表 ...

  10. Python中使用rrdtool结合Django进行带宽监控

    我们有个网关需要做下带宽监控,能获取这个数据的唯一方法就是登录到管理界面查看.然后咱就写了个模拟登录的爬虫,定时抓取数据用rrdtool存储,最后通过Django来展示.这里就涉及了python的rr ...