一、视图切换

  • UITabBarController (分页控制器) - 平行管理视图
  • UINavigationController (导航控制器) - 压栈出栈管理视图
  • 模态窗口

二、UITabBarController分页控制器

  1. UITabBarController是为了利用 页签切换视图 设计的控制器
  2. 该控制器有一个UITabBar控件,用户通过点击UITabBar进行视图切换
  3. UITabBarController本身会不显示任何视图,它只是一个 容器控制器
  4. 为了减少视图间的耦合,所有UITabBarController的子视图的相关标题、图标等信息由子视图自己控制

注意事项:
  • UITabBarController会一次性初始化所有子控制器,但默认只加载第一个控制器视图
  • 每个视图控制器都有一个tabBarController属性,用它来访问所在的UITabBarController
  • 每个视图控制器都有一个tabBarItem属性,用它来控制UITabBarControllerUITabBar上的显示信息
  • tarBarItemimage属性必须是png格式,并且打开alpha通道 ,否则无法正常显示

UITabBarController通常是作为整个程序的rootViewController的,我们需要在程序的window显示之前就创建好它。

具体步骤如下:
  1. 创建一个UITabBarController对象
  2. 创建UITabBarController中每一个tab对应的要显示的对象viewController
  3. 通过UITabBarControllerviewControllers属性将要显示的所有viewController添加到UITabBarController
  4. 通过设置UITabBarController对象为window.rootViewController,然后显示window
//a.初始化一个tabBar控制器
UITabBarController *tarbarVC = [[UITabBarController alloc] init];
//设置控制器为Window的根控制器
self.window.rootViewController = tarbarVC;
//b.创建子控制器
UIViewController *c1 = [[UIViewController alloc] init];
c1.view.backgroundColor = [UIColor grayColor];
c1.view.backgroundColor=[UIColor greenColor];
c1.tabBarItem.title = @"消息";
c1.tabBarItem.image = [UIImage imageNamed:@"tab_recent_nor"];
c1.tabBarItem.badgeValue = @"123";
UIViewController *c2 = [[UIViewController alloc] init];
c2.view.backgroundColor = [UIColor brownColor];
c2.tabBarItem.title = @"联系人";
c2.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"];
UIViewController *c3 = [[UIViewController alloc] init];
c3.tabBarItem.title = @"动态";
c3.tabBarItem.image = [UIImage imageNamed:@"tab_qworld_nor"];
UIViewController *c4 = [[UIViewController alloc] init];
c4.tabBarItem.title = @"设置";
c4.tabBarItem.image = [UIImage imageNamed:@"tab_me_nor"];
//c.添加子控制器到ITabBarController中
tarbarVC.viewControllers = @[c1,c2,c3,c4];
//d.设置Window为主窗口并显示出来
[self.window makeKeyAndVisible];
UITabBarControllerDelegate代理
#pragma mark 该方法用于控制TabBarItem能不能选中
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
改变UITabBarController当前显示视图的方法
  1. 改变selectedIndex属性
  2. 改变selectedViewController属性
  3. 改变viewControllers属性

三、UINavigationController导航控制器

  1. UINavigationController中的子控制器以栈的形式存储,只有在栈顶部的控制器才能显示在界面上
  2. 压栈pushController,出栈popController
  3. UINavigationController必须有一个根控制器rootViewController
  4. 子控制器通过navigationController属性访问UINavigationController
  5. 在栈中的子控制器都有一个导航栏navigationBar,通过navigationItem去控制
UINavigationItem属于MVC中的Model,封装了要显示在UINavigationBar上的数据:

title: 标题
titleView :标题视图
leftBarButtonItem :左按钮
rightBarButtonItem :右按钮

下一个子视图左侧返回按钮leftBarButtonItem的标题优先级:
  1. 导航栏返回按钮backBarButtonItem的标题
  2. 导航栏navigationItem的标题
  3. 视图控制器的标题
UINavigationController常用的主要方法:
#pragma mark 压栈,把控制器压入导航控制器子控制器栈中
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 出栈,把导航控制器子控制器栈的栈顶弹出
- (void)popViewControllerAnimated:(BOOL)animated;
#pragma mark 多次出栈直到栈顶为指定控制器
- (void)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
#pragma mark 多次出栈直到栈顶为根控制器
- (void)popToRootViewControllerAnimated:(BOOL)animated;

四、模态窗口

#pragma mark 从下方弹出指定的视图控制器,赋予模态,即当前视图关闭前,其他视图上的内容无法操作
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
#pragma mark 关闭模态窗口,该方法在模态窗口中调用
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;

iOS学习笔记04-视图切换的更多相关文章

  1. iOS学习笔记——滚动视图(scrollView)

    滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性 @interface BoViewController : UIViewController<UIScro ...

  2. IOS 学习笔记(2) 视图UINavigationController

    1.栈 导航控制器自身有一个针对显示内容的栈,也有一个对于导航栏的栈,当有新的内容欲显示时,进的导航栏和显示内容会被压入此栈,这样原本显示中的导航栏和显示内容则会进入到栈的更深一层中,根据栈的先进后出 ...

  3. [ios学习笔记之视图、绘制和手势识别]

    一 视图 二 绘制 三 手势 00:31 UIGestureRecognizer 抽象类 两步 1添加识别器(控制器或者视图来完成) 2手势识别后要做的事情 UIPanGestureRecognize ...

  4. IOS 学习笔记(3) 视图UITabbarController

    1.UITabbarViewController标签试图控制器.由于标签页本就起着分类的作用,所以往往呈现的视图内容之间,可以是毫不相关的功能. UITabbarViewController仍然继承自 ...

  5. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  6. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

  7. iOS学习笔记-自定义过渡动画

    代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...

  8. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  9. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

随机推荐

  1. JavaScript数据格式验证探讨

    1.需求 修改某个文本框数据,要求对修改后的格式做验证(必须是数字). 注:实际需求比上述复杂,为了说明问题,这里特意简化了需求(如:对修改后数据依赖条件的判断,数据入库等). 2.关于NaN的探讨( ...

  2. 用python格式化小说txt

    下载了<无人生还>的txt版.传到手机,发现阅读器识别得不够好. 原文格式如下: 第一章 一 沃格雷夫法官先生新近离任退休,现在正在头等车厢的吸烟室里,倚角而坐,一 边喷着雪茄烟,一边兴致 ...

  3. SQLServer怎样把本地数据导入到远程服务器上(转载)

    平常用到mssql时间比较少,总是过一段时间就忘记应该怎么操作了.当要做mssq把本地数据导入到远程服务器的时候,就去网上搜索很久都没有图解的,所以今天自己收集一下免得下次又到处去找.希望对自己,同时 ...

  4. Javascript的一些经验总结

    JavaScript作用域 1.作用域 JavaScript的作用域与C.Java等语言不同,它不是以花括号包围的块级作用域,这个特性经常被大多数人忽视.例如下面代码,在大多数类C的语言中会出现变量未 ...

  5. Django ORM 一对一,一对多,多对多, 添加,批量插入和查询

    模型类 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_ ...

  6. 爬虫_python3_抓取猫眼电影top100

    使用urllib,request,和正则表达式,多线程进行秒抓,以及异常处理结果: import urllib,re,json from multiprocessing import Pool#多进程 ...

  7. jExcelAPI导入导出excel

      MS的电子表格(Excel)是Office的重要成员,是保存统计数据的一种常用格式.作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便.在 ...

  8. iOS之WKWebView

    Xcode8发布以后,编译器开始不支持IOS7,所以很多应用在适配IOS10之后都不在适配IOS7了,其中包括了很多大公司,网易新闻,滴滴出行等.因此,我们公司的应用也打算淘汰IOS7. 支持到IOS ...

  9. 【NOIP2017提高A组冲刺11.6】拆网线

    和syq大兄弟吐槽题目不小心yy出了正解.. 最优的选法就是选两个两个相互独立的,欸这不就是最大匹配吗?那多的企鹅就新加一条边呗?不够的就除以2上取整呗? 欸?AC了? 树也是一个二分图,最大匹配=最 ...

  10. CSS3-盒模型-resize属性

    作用:用来改变元素尺寸大小. 1.resize:none|both|horizontal|vertical|inherit none:不能拖动修改尺寸大小 both:可以拖动元素,修改元素宽高 hor ...