(三十四)NavigationController初步
为了了解底层,首先不基于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初步的更多相关文章
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- spring boot 常见三十四问
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
- “全栈2019”Java第三十四章:可变参数列表
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- Mac下安装PEAR
The following instructions install PEAR and PECL on Mac OS X under/usr/local/. PECL is bundled with ...
- 在Spring Boot框架下使用WebSocket实现聊天功能
上一篇博客我们介绍了在Spring Boot框架下使用WebSocket实现消息推送,消息推送是一对多,服务器发消息发送给所有的浏览器,这次我们来看看如何使用WebSocket实现消息的一对一发送,模 ...
- CSAPP缓冲区溢出攻击实验(下)
CSAPP缓冲区溢出攻击实验(下) 3.3 Level 2: 爆竹 实验要求 这一个Level的难度陡然提升,我们要让getbuf()返回到bang()而非test(),并且在执行bang()之前将g ...
- Linux 下不经过BIOS重启(i386)
前段时间有个项目,要求在Linux下不经过BIOS重启,i386平台. 一.可行性分析 众所周知,BIOS中包含了CPU及其他各种设备的初始化代码,Linux系统运行之后是否能够将各种用到的设备返回到 ...
- Android的Intent机制详解
Intent 是一个消息传递对象,您可以使用它从其他应用组件请求操作.尽管 Intent 可以通过多种方式促进组件之间的通信,但其 基本用例主要包括以下三个: 启动 Activity: Activit ...
- Python动态展现之一
首先: def f(): print('first') def g(): f() g() def f(): print('second') g() 结果: >>> first sec ...
- 通过grub-install命令把grub安装到u盘
通过grub-install命令把grub安装到u盘 ①准备一个u盘,容量不限,能有1MB都足够了. ②把u盘格式化(我把u盘格式化成FAT.fat32格式了,最后证明也是成功的).③开启linux系 ...
- [Matlab]技巧笔记
1.将字符串作为Matlab命令执行 md = 'dir'; eval(md); 2.将字符串作为系统命令执行 md = 'dir'; system(md); 3.使显示图像的坐标轴使用相同的度量单位 ...
- Dynamics CRM2013/2015 插件注册工具登录后无法显示assembly列表问题的解决办法二
本篇接前面的一篇博文:http://blog.csdn.net/vic0228/article/details/47079717,前篇提供了一种解决方案,将本机系统的语言切换成英文即可,今天再来介绍第 ...
- 【ShaderToy】开篇
写在前面 呜呼,好久没有写博客了,好惭愧.题外话,感觉越大就越想家,希望可以一直和家人在一起,哪怕只是坐在一起不说话也觉得很温暖,一想到要分开眼睛就开始酸,哎.开学还是爬上来老实更新博客学习吧~ 今天 ...