首页 > 代码库 > 【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序
【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]; }
//如果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详解
【iOS开发-30】UITabBarController的几种代理方法以及结合NSUserDefaults还原上次退出时被选中视图控制器和视图控制器的顺序