【iOS開發-30】UITabBarController的幾種代理方法以及結合NSUserDefaults還原上次退出時被選中視圖控制器和視圖控制器的順序,uitabbarcontroller
一、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詳解