【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序

时间:2022-06-23 20:48:34

一、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的很多其它阅读

(1)NSUserDefaults注意事项

(2)NSUserDefaults简单介绍及使用

(3)NSUserDefaults具体解释