当前位置: 首页 > 编程日记 > 正文

UIViewController、UINavigationController与UITabBarController的整合使用

UINavigationController与UITabBarController是iOS开发中最常用的两种视图控制器,它们都属于UIViewController的子类,继承关系如下:

@interface UITabBarController : UIViewController <UITabBarDelegate, NSCoding>
@interface UINavigationController : UIViewController

UINavigationController:同级页面之间的跳转,界面典型的特点就是页面上部有一UINavigationBar导航条,导航条可以设置标题、左上角的按钮(一般用于返回),右上角的按钮,也可以自定义这些元素。 
UITabBarController:父子页面之间的嵌套关系,界面典型的特点是耍耍下部有一UITabBar选项组,通过点击Tab,可切换上面的视图的变换。
UIViewController、UINavigationController、UITabBarController三者的整合使用,可以开发出大部分的App应用页面框架。 
一、在我们项目AppDelegate中添加UIViewController

//把UIViewController添加的应用中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];SplashViewController *splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashViewController" bundle:nil];self.window.rootViewController = splashViewController;self.window.backgroundColor = [UIColor whiteColor];[self.window makeKeyAndVisible];return YES;
}

上面说过,UINavigationController与UITabBarController是UIViewController的子类,所以,也可以按这样的方式添加,主要看项目界面的需要。


二、UIViewController之间的跳转与传参 
一般的应用程序都不会只有一个页面,而页面之间的跳转,可以这样调用:

//从UIViewController跳转到另一个UIViewController
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];
[self presentViewController:loginViewController animated:true completion:^{}];
//从UIViewController返回上一个UIViewController
[self dismissViewControllerAnimated:true completion:^{}];


很多从Android开发转过来的同事,都会问一个问题:两个页面之间怎么传递参数? 
其实,Android通过Intent对象来跳转和传递参数,当前页面是拿不到下一个页面的实例;而在iOS中,我们是通过直接创建的方式创建下一个页面实例的,所以,你可以在下一个UIViewController实例中提供一个方法,供当前页面去给它设置参数就行。 
在Android中,返回上一个页面,还是通过Intent来回传参数;而在iOS中,可通过设置代理的方式来传参。具体使用下面的例子中会看到。 
三、由UIViewController跳转到UITabBarController

//从UIViewController跳转到UINavigationController
HomeViewController *homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
[self presentViewController:navigationController animated:true completion:^{}];


HomeViewController是一个UITabBarController子类,代码如下:

//HomeViewController是一个UITabBarController子类
@interface HomeViewController : UITabBarController<UITabBarControllerDelegate, HomeDelegate>
@end




四、UITabBarController嵌套子页面 
在本例中,这个UITabBarController还属于UINavigationController导航链中的一个环节,故可以调用导航控制器相应的方法。 
UITabBarController本身可以嵌套多个子页面的,每个页面可以由一个UIViewController来提供。代码如下:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {//设置导航标题self.title = @"Message";//设置导航左上角的按钮UIBarButtonItem *leftBtn = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(onLeftBtnClick:)];self.navigationItem.leftBarButtonItem = leftBtn;//设置导航右上角的按钮UIImage *img = [UIImage imageNamed:@"msgIcon"];UIBarButtonItem *rightBtn = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStyleBordered target:self action:nil];self.navigationItem.rightBarButtonItem = rightBtn;//新建Tab页面UserListViewController *userListViewController = [[UserListViewController alloc] initWithNibName:@"UserListViewController" bundle:nil];MessageListViewController *messageListViewController = [[MessageListViewController alloc] initWithNibName:@"MessageListViewController" bundle:nil];//添加Tab耍耍到Tab控制器self.viewControllers = @[messageListViewController, userListViewController];//设置UITabBarControllerDelegate代理self.delegate = self;}return self;
}


五、UITabBarController子页面之间的切换

HomeViewController实现了UITabBarControllerDelegate协议,可用于Tab切换时执行某此操作,如下:

//实现协议方法,用于切换Tab时,更改页面的标题
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {NSInteger index = tabBarController.selectedIndex;NSString *title;switch (index) {case 0:title = @"Message";break;case 1:title = @"User List";break;}self.title = title;
}


在UITabBarController的子页面(为UIViewController实例)中,可以设置该子页面所对应的TabBar项的相关属性,如下:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {// Custom initializationself.tabBarItem.title = @"User List";self.tabBarItem.image = [UIImage imageNamed:@"chatIcon01"];}return self;
}



六、UITabBarController子页面跳转到UINavigationController的下一个页面 
从UITabBarController子页面跳转到UINavigationController的下一个页面,注意:前提是UITabBarController是属于UINavigationController导航链中的一个节点。

//从UITabBarController的子页面跳转到UINavigationController的下一个页面:
ChatViewController *chatViewController = [[ChatViewController alloc] initWithNibName:@"ChatViewController" bundle:nil];
UITabBarController *homeController = self.tabBarController;
[chatViewController setHomeDelegate:homeController];
[self.tabBarController.navigationController pushViewController:chatViewController animated:true];


这里说一下用代理来实现参数的回传,这个代理的宝义如下:

@protocol HomeDelegate <NSObject>
-(void) onComeback:(NSString*) message;
@end


需要在下一个页面(例子中的ChatViewController)中,添加这个代理作为它的属性,如下:

@interface ChatViewController : UIViewController
@property (weak) id<HomeDelegate> homeDelegate;
@end@implementation ChatViewController
@synthesize homeDelegate;
@end




七、返回上一个页面与参数回传 
要从ChatViewController返回到上一个页面,可执行下面代码:

[homeDelegate onComeback:@"Hello"];
[self.navigationController popViewControllerAnimated:true];


这样,就可以实现了参数的回传。 


UINavigationController的页面回退的两个常用方法:

//返回导航的上一个页面
[self.navigationController popViewControllerAnimated:true];//返回导航的第一个页面
[self.navigationController popToRootViewControllerAnimated:true];

相关文章:

小学生正确使用计算机,小学生做数学作业用计算器的做法正确吗?为什么?

用计算器做数学题是一种偷懒的做题方法&#xff0c;不知道现在的数学课本上还有没有计算机教学这一章节的内容&#xff0c;学习使用计算器也是学习内容之内的&#xff0c;但是计算器是用来解决那些较复杂的数字运算的&#xff0c;基本的四则运算还是不要用计算器&#xff0c;尽…

【php】 PHP 支持 9 种原始数据类型

PHP 支持 9 种原始数据类型。 四种标量类型&#xff1a; boolean&#xff08;布尔型&#xff09;integer&#xff08;整型&#xff09;float&#xff08;浮点型&#xff0c;也称作 double)string&#xff08;字符串&#xff09;三种复合类型&#xff1a; array&#xff08;数组…

linux安装vsftpt服务,centos安装vsftp服务.md

# 使用nginx和vsftp搭建图片服务器并使用Java上传图片到该图片服务器## 安装vsftp1、首先&#xff0c;安装vsftpdshellyum -y install vsftpd复制代码2、验证是否安装成功shellrpm -qa vsftpd复制代码3、查看vsftp相关配置文件shellll /etc/vsftpd/复制代码vsftpd.conf文件是主…

android support v4、v7、v13

android support v4、v7、v13的区别及作用和用法 1, Android Support V4, V7, V13是什么? 本质上就是三个java library。 2, 为什么要有support库? 如果在低版本Android平台上开发一个应用程序,而应用程序又想使用高版本才拥有的功能,就需要使用Support 3, 三个Support 库的…

SimpleInjector 简单使用

SimpleInjector 简单使用&#xff0c;未完待续转载于:https://www.cnblogs.com/aresyl/p/6627372.html

win设置计算机网络,Win10怎么修改网络类型,Win10网络类型怎么设置?

Win10怎么修改网络类型,Win10网络类型怎么设置?对某件事物越是了解的深入&#xff0c;越是能发现产品的猫腻!比如Win10!因为产品性能没升级多少&#xff0c;但是马甲换的却非常勤快!可能有些朋友会感觉&#xff0c;下面的内容似曾相识。下面的Win10怎么修改网络类型的内容&…

GIL+死锁与递归锁+信号量+event事件

GIL全局解释器锁: GIL本质就是一把互斥锁,相当于执行权限,每个进程内都会存在一把GIL,同一进程内的多个线程 必须抢到GIL之后才能使用Cpython解释器来执行自己的代码,即同一进程下的多个线程无法实现并行 但是可以实现并发 在Cpython解释器下,如果想实现并行可以开…

编程之法----面试和算法心得

第1章 字符串 1.1 字符串的旋转 输入一个英文句子&#xff0c;翻转句子中单词的顺序。要求单词内字符的顺序不变&#xff0c;句子中单词以空格符隔开。为简单起见&#xff0c;标点符号和普通字母一样处理。例如&#xff1a;若输入“I am a student.”&#xff0c;则输出“stude…

ios 消息通知

苹果的通知分为本地通知和远程通知&#xff0c;这里主要说的是远程通知 历史介绍 iOS 3 - 引入推送通知UIApplication 的 registerForRemoteNotificationTypes 与 UIApplicationDelegate 的 application(_:didRegisterForRemoteNotificationsWithDeviceToken:)&#xff0c;appl…

aml linux 环境,各位辛苦编译DSDT.aml的兄弟,linux是个好工具啊,简单提取

本小菜先后安装雪豹和lion&#xff0c;驱动一直不能完美解决。本想靠dsdt和idsdt大法驱动我的G310M显卡&#xff0c;可是困难重重。小本bios为phoenix&#xff0c;而非各位大神提供的ami和aword板&#xff0c;编译错误达到201处&#xff0c;更改rtc处编译剩余7处错误&#xff0…

华南理工网络计算机基础知识,2019年华南理工大学网络教育计算机基础随堂练习第一章...

2019年华南理工大学网络教育计算机基础随堂练习第一章 (9页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;11.90 积分&#xfeff;第一章 计算机基础知识第一节 计算机的基本概念随堂练习提交截止时间…

AFN 切换BaseUrl

在某个特定的接口需要修改baseurl时&#xff1a; 直接使用kvc&#xff1a; [_sessionManager setValue:[NSURL URLWithString:NEW_BASE_URL] forKey:"baseURL"];在发出请求后&#xff0c;在修改会通用的baseurl 转载于:https://www.cnblogs.com/liuwenqiang/p/960667…

按下开机键,计算机背后的故事

计算机是如何启动的&#xff1f; 从打开电源到开始操作&#xff0c;计算机的启动是一个非常复杂的过程。 我一直搞不清楚&#xff0c;这个过程到底是怎么回事&#xff0c;只看见屏幕快速滚动各种提示...…… 零、boot的含义 问&#xff1a;"启动"用英语怎么说&#…

android 图片缓存

一、Picasso https://github.com/square/picasso Picasso是Square公司开源的一个Android平台上的图片加载框架&#xff0c;简单易用&#xff0c;一句话搞定项目中的图片加载&#xff0c;好用到令人发指。 使用一句话&#xff1a;Picasso.with(this).load("url").plac…

linux shell cgi post,linux下shell处理cgi的方法--post get

web server获取网页上HTML的DOM对象信息发送来的信息&#xff0c;主要有get和post方法。介绍原理的文章很多&#xff0c;但介绍实际应用到linux的shell中的文章很少。1、get方法①表单源码如下&#xff0c;有几个HTML对象作为传值对象。CGI TestText fieldRadio button123②cgi…

福建工程学院计算机科学类投档线,2019年福建工程学院美术类本科专业投档分数线...

福建工程学院2019年美术类本科专业录取情况省份科类专业计划最高分最低分平均分江苏艺术综合环境设计5247.2241.2244.6视觉传达设计3244.2240241.8数字媒体艺术3247.2244.2246产品设计3243.8238.6241.1安徽艺术综合环境设计5728.7724.9726.9视觉传达设计4729726.5727.3数字媒体…

如何对正在运行的进程,进行heap profile

简单来说, 就是先preload上tcmalloc, 日常用用没啥问题, 当感觉出现问题时, gdb attach 上, 然后执行 call HeapProfilerStart("xxx") , 过一段时间, 再执行call HeapProfilerStop, 产出相应的profile文件, 然后detach出进程 以下为一些未整理的 link https://gperft…

linux 命令窗口美化,美化你的命令行终端Terminal

yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:47发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20:46发表:太好了yuezhang.su 于 2009-05-13 18:20…

mac 显示隐藏文件

打开终端&#xff0c;输入&#xff1a;defaults write com.apple.finder AppleShowAllFiles -bool true 此命令显示隐藏文件defaults write com.apple.finder AppleShowAllFiles -bool false 此命令关闭显示隐藏文件命令运行之后需要重新加载Finder&#xff1a;快捷…

Android修改包名

1.直接Refactor ---> rename 2.修改build.gradle ---> applicationId 为新包名 3.修改后要注意XML中自定义控件的全名是否也改变了 参考&#xff1a;android studio 改包名转载于:https://www.cnblogs.com/jarvisyin/p/6634392.html

学计算机的好处处300字,学计算机的心得体会300字

学计算机的心得体会300字我们从一些事情上得到感悟后&#xff0c;可以寻思将其写进心得体会中&#xff0c;这么做可以让我们不断思考不断进步。那么好的心得体会都具备一些什么特点呢&#xff1f;以下是小编精心整理的学计算机的心得体会300字&#xff0c;欢迎大家分享。学计算…

洛谷 3519 bzoj 2213 Difference

联考考试考到了这个题&#xff0c;随机化40分&#xff0c;现在来秒掉它吧。 题意&#xff1a; 给一个字符串&#xff0c;求其中的一段&#xff0c;使得出现次数最多的字符与出现次数最少的字符的出现次数之差最大。 输入输出样例 输入样例#1&#xff1a; 复制 10 aabbaaabab 输…

linux 文件管理 教程,Linux文件管理

Linux文件管理本文介绍如何在Linux上创建文件、删除文件、复制文件、移动文件使用touch命令在linux上创建文件使用rm命令在linux上删除文件使用cp命令在linux上复制拷贝文件mv命令在linux上移动或重命名文件##文件简介Linux中文件可以分为普通文件、目录文件、链接文件、设备文…

ios cocopods 安装使用及高级教程

CocoaPods简介 每种语言发展到一个阶段&#xff0c;就会出现相应的依赖管理工具&#xff0c;例如Java语言的Maven&#xff0c;nodejs的npm。随着iOS开发者的增多&#xff0c;业界也出现了为iOS程序提供依赖管理的工具&#xff0c;它的名字叫做&#xff1a;CocoaPods。http://co…

单片微型计算机概念及组成,中国民用航空飞行学院2014年微机原理与接口考研复习大纲...

中国民用航空飞行学院硕士研究生入学考试801《微机原理与接口》复习大纲第一部分 考试说明一、 考试性质《微机原理与接口》是中国民用航空飞行学院硕士生入学考试科目之一。它的评价标准是高等学校、科研院所的优秀本科毕业生能达到及格以上水平&#xff0c;以保证被录取者具…

【转】Jmeter常见问题

收集工作中JMeter遇到的各种问题1. JMeter的工作原理是什么&#xff1f;向服务器提交请求&#xff1b;从服务器取回请求返回的结果。2. JMeter的作用&#xff1f;JMeter可以用于测试静态或者动态资源的性能&#xff08;文件、Servlets、Perl脚本、java对象、数据库和查询、ft…

linux的tar中ztvf,linux中的tar命令(2)

实例4&#xff1a;只将 /tar 内的 部分文件解压出来命令&#xff1a;tar -zxvf /opt/soft/test/log30.tar.gz log2013.log输出&#xff1a;[rootlocalhost test]# tar -zcvf log30.tar.gz log2012.log log2013.loglog2012.loglog2013.log[rootlocalhost test]# ls -al log30.ta…

xcode 消除警告

项目中引用大量的第三方代码时&#xff0c;这些代码很复杂&#xff0c;不要轻易去改动它&#xff0c;如果编译产生很多警告&#xff0c;该如何消除呢&#xff1f; 1. 最直接、最一劳永逸、最安全的方式&#xff0c;直接找到警告的那段代码&#xff0c;改为不警告。这个方式最安…

RoadMap

转载于:https://www.cnblogs.com/taogao3364/p/9616020.html

罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...

美国电子工程排名 - 电子计算机工程的研究生教育&#xff0c;特别是偏向电路设计方向&#xff0c;请问是美国罗格斯大学新布朗斯维克校区好还是清华&#xff0c;1. 电子计算机工程的研究生教育&#xff0c;特别是偏向电路设计方向&#xff0c;请问是美国罗格斯大学新布朗斯维克…