【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序
一、UITabBarController的几种代理方法
在AppDelegate.h中加入一个协议<UITabBarControllerDelegate>。然后再AppDelegate.m中加入例如以下代理方法:
假设没有效果,可能是缺少tbCon1.delegate=self;把代理指定给当前AppDelegate。
-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{
NSLog(@"clicked");
return YES;
}
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
NSLog(@"%@",viewController.title);
}
-(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{
NSLog(@"will Customize");
}
-(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
if (changed) {
NSLog(@"changed!");
}else{
NSLog(@"not changed");
}
for (UIViewController *vcs in viewControllers) {
NSLog(@"%@",vcs.title);
}
}
-(void)tabBarController:(UITabBarController *)tabBarController DidEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
}
二、注意事项
(1)用代理方法调用title时,仅仅有当上面的视图控制器或者导航控制器用.title方法赋值。才干被调用。否则返回值是Null。
(2)而用initWithTitle方法赋值的都是给.tabBarItem.title赋值,无法直接用.title来获取到值。
(3)所以。假设实用initWithTitle赋值的。能够再用.title又一次赋值一遍,这样便于在其它方法中获取到值。
三、利用NSUserDefaults复原上次被选中视图
在didSelectViewController代理方法中创建一个NSUserDefaults来记录被选中的那个视图的title。
-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
//选择某一个视图控制器后,就把相应的标题存储在NSUserDefaults中,在上面利用
//创建一个NSUserDefaults,假设能取到title,就把title赋值进去储存
NSUserDefaults *def1=[NSUserDefaults standardUserDefaults];
if (viewController.title) {
[def1 setObject:viewController.title forKey:SELECTEDKEY];
}
//数据同步到应用程序中
[def1 synchronize];
}
然后,在didFinishLaunchingWithOptions方法中增加下面代码,即假设查到上次退出程序时有存储title的话。那么就寻找这个title相应的视图控制器,并把这个视图控制器设置为我们本次打开程序默认的选中视图控制器。如此便相当于还原了上次选中的模样。(SELECTEDKEY是#define的宏变量)
//假设NSUserDefaults里面有存储的,就直接取值过来。然后与现有的标签比較,就能够得知上次打开的时哪一个标签,并把这个把标签设置为默认打开的
if ([[NSUserDefaults standardUserDefaults]objectForKey:SELECTEDKEY]) {
for (UIViewController *vcs1 in arr2) {
if ([vcs1.title isEqualToString:[[NSUserDefaults standardUserDefaults]objectForKey:SELECTEDKEY]]) {
tbCon1.selectedViewController=vcs1;
}
}
}
四、利用NSUserDefaults复原上次视图顺序
在didEndCustomizingViewControllers代理方法中创建一个NSUserDefaults来记录上次视图控制器的顺序,当然是记录它们的标题顺序。
-(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{
//把点击DONE之后的新的视图控制器的标题按顺序存在def2中,然后在上面利用
NSUserDefaults *def2=[NSUserDefaults standardUserDefaults];
NSMutableArray *arr2=[[NSMutableArray alloc]init];
for (UIViewController *vcs2 in viewControllers) {
[arr2 addObject:vcs2.title];
}
[def2 setObject:arr2 forKey:TITLESKEY];
[def2 synchronize];
}
然后,在didFinishLaunchingWithOptions方法中增加下面代码。即假设我们捕捉到之前有存储的title数组。那么从第一个title開始找它相应的视图控制器,并把这个视图控制器存放在新的数组里面,这样按顺序就能够得到一个新的顺序的视图控制器数组。
最后把这个新的视图控制器数组赋值给标签控制器的viewControllers,就相当于还原了上次退出程序时视图控制器顺序的模样。(TITLESKEY是#define的一个宏变量)
//使用之前关闭程序前标签栏的顺序
//创建一个数组。把存储在NSUserDefaults里地数组取出来
NSArray *newTitle1=[[NSUserDefaults standardUserDefaults]objectForKey:TITLESKEY];
//假设确实有这个数组,那么遍历这个标题数组和之前的视图控制器数组。假设视图控制器的标题等于这个数组的第一个标题。那么就把这个视图控制器放在一个新的数组里面
if (newTitle1) {
NSMutableArray *newArr1=[[NSMutableArray alloc]init];
for (NSString *title1 in newTitle1) {
for (UIViewController *vcs3 in arr2) {
if ([vcs3.title isEqualToString:title1]) {
[newArr1 addObject:vcs3];
}
}
}
//然后把这个新的视图控制器的数组赋值给标签控制器
tbCon1.viewControllers=newArr1;
}
五、关于NSUserDefaults的很多其它阅读
【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序的更多相关文章
- iOS开发之巧用Block和代理方法结合来传值
好久没写技术博客了,因为996的工作周期已经持续好几个月了.每天晚上回家都没有太多精力学习很多其他的东西,而且很多时候是接着完善工作的项目的模块开发.所以博客停歇了这么久,更新率也低了不少,今天补充一 ...
- ios开发UI篇—UIScrollView属性及其代理方法
一.UIScrollView是什么? 1.UIScrollView是滚动的view,UIView本身不能滚动,子类UIScrollview拓展了滚动方面的功能. 2.UIScrollView是所有滚动 ...
- iOS开发CoreAnimation解读之三——几种常用Layer的使用解析
iOS开发CoreAnimation解读之三——几种常用Layer的使用解析 一.CAEmitterLayer 二.CAGradientLayer 三.CAReplicatorLayer 四.CASh ...
- IOS中tableView每组的头部控件、通过tableView的代理方法控制某一行的cell能否达到高亮选中状态
一.tableView每组的头部控件 1.控件宽度默认就是tableView的宽度 2.控件高度由下面的代理方法决定 - (CGFloat)tableView:(UITableView *)table ...
- iOS 开发之模糊效果的五种实现
前言 在iOS开发中我们经常会用到模糊效果使我们的界面更加美观,而iOS本身也提供了几种达到模糊效果的API,如:Core Image,使用Accelerate.Framework中的vImage A ...
- iOS开发-项目的完整重命名方法,图文教程。
前言:在IOS开发中,有时候想改一下项目的名字,都会遇到很多麻烦.直接改项目名吧,XCODE又不会帮你改所有的名字.总是有很多文件.文件夹或者是项目设置的项.而且都是不能随便改的,有时候改着改着,编译 ...
- 04_Spring AOP两种代理方法
什么是AOP? AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是O ...
- ios开发之--tableview单选/多选实现(非tableview的editing状态)及默认选中
实现思路比较简单,这里仅做记录: 直接上代码: 1,实现didSelectRowAtIndexPath方法 -(void)tableView:(UITableView *)tableView didS ...
- iOS开发之 -- 判断tableview/scrollview的滑动方法,及导航栏渐变的实现代码
开发的过程中,肯定会用到在视图想上滑动的时候,在导航处做一些操作,比如向上滑动的时候,做个动画,出现一个搜索框,或者其他的操作,那么我们怎么来判断它的滑动方向呢? 首先我们应该知道tableview继 ...
随机推荐
- sqlite学习笔记7:C语言中使用sqlite之打开数据库
数据库的基本内容前面都已经说得差点儿相同了.接下看看如何在C语言中使用sqlite. 一 接口 sqlite3_open(const char *filename, sqlite3 **ppDb) 打 ...
- Line(扩展欧几里得)
题意:本题给出一个直线,推断是否有整数点在这条直线上: 分析:本题最重要的是在给出的直线是不是平行于坐标轴,即A是不是为0或B是不是为0..此外.本题另一点就是C输入之后要取其相反数,才干进行扩展欧几 ...
- SharePoint 创建网站地图树视图及格式枚举截图
SharePoint 创建网站地图树视图及格式枚举截图 SharePoint首页隐藏掉左側导航以后,假设要以树视图呈现站点地图也非常easy. 仅仅须要复制v4.mas ...
- bzoj1588: [HNOI2002]营业额统计(splay)
1588: [HNOI2002]营业额统计 题目:传送门 题解: 复习splay所以来刷个水... 题目描述不是特别清楚:应该是找第i天以前一个最小的营业额和第i天做差的最小值作为第i天的最小波动值 ...
- P1233 木棍加工
P1233 木棍加工 题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间 ...
- struts2-action中使用通配符
转自:https://www.cnblogs.com/ningvsban/p/3734574.html 在以前的学习中,<action>元素的配置,都是用明确的配置,其name.class ...
- BZOJ 1989 概率相关
思路: 一条边免费的概率为 (经过它的路/总路径条数)^2 DFS即可 有个地方没有用 long long炸了好久- //By SiriusRen #include <cstdio> us ...
- httpclient定时请求实例
1.pom.xml <properties> <slf4j.version>1.7.21</slf4j.version> <okhttp.version> ...
- Hua Wei 机试题目四---2014
一.计算亮灯的个数 描述:一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.…n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号 ...
- 关于Java中equal函数和==的一些区别
equal函数比较的到底是什么,很明显是比较的值,但是什么值?与==比较的堆中的内存地址不同,其比较的是对象的值,包括各个属性的值.我们在重新overriding此方法时首先要判断是否为同一对象,如果 ...