1. 程式人生 > >導航欄控制器和標籤欄控制器(UINavigationController和UITabBarController)混用

導航欄控制器和標籤欄控制器(UINavigationController和UITabBarController)混用

  • 很多時候,在UI設計方面同時需要使用導航控制器和標籤欄控制器,這時,需要掌握如何設計結合使用這兩種不同控制器。比如手機QQ,程式有三個標籤欄(分別為訊息、聯絡人、動態),同時在選擇某個聯絡人或者會話時,會進入聊天的子頁面,因此這裡同時使用到了標籤欄控制器和導航控制器。

    我目前所知道有以下方法可實現上述的結合使用效果。

    根檢視是標籤欄控制器,然後每頁標籤欄又有一個根檢視控制器為導航欄控制器的標籤,如下程式碼所示 01.// 訊息 02.MessageViewController* msg = [[MessageViewController alloc] init]; 03.UINavigationController* navControloler = [[UINavigationController alloc] init];
    04.[navControloler pushViewController:msg animated:YES]; 05.[viewArray addObject:navControloler]; 06. 07.// 聯絡人 08.ContactViewController* contact = [[ContactViewController alloc] init]; 09.navControloler = [[UINavigationController alloc] init]; 10.[navControloler pushViewController:contact animated:YES];
    11.[viewArray addObject:navControloler]; 12. 13.// 動態 14.FavoriteViewController* favorite = [[FavoriteViewController alloc] init]; 15.navControloler = [[UINavigationController alloc] init]; 16.[navControloler pushViewController:favorite animated:YES]; 17.[viewArray addObject:navControloler];
    18. 19.// 標籤欄控制器 20.UITabBarController* tabBarController = [[UITabBarController alloc] init]; 21.tabBarController.viewControllers = viewArray; 22. 23.// 修改根檢視 24.AppDelegate* appDelagete = [UIApplication sharedApplication].delegate; 25.appDelagete.window.rootViewController = tabBarController; 上述程式碼是在ViewController.m檔案中,也就是說,APP的根檢視控制器可以在AppDelegete外的其他地方修改,因此,可以設計出先顯示登入介面,然後再顯示程式的主頁面,即標籤欄頁面檢視。注意根檢視是標籤欄,所以返回按鈕無效,如下所示
    \ 如果上述程式碼的根檢視是導航欄,那麼返回按鈕是有效的,可以用作退出登入等類似的功能,其主要實現如下,在AppDelegate裡設定根檢視控制器 01.- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 02.{ 03.// Override point for customization after application launch. 04.self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 05. 06.UINavigationController* navController = [[UINavigationController alloc] init]; 07.[navController pushViewController:[[ViewController alloc] init] animated:YES]; 08. 09.self.window.rootViewController = navController; 10.return YES; 11.} 然後ViewController中將標籤欄控制器當做導航欄控制器的子檢視Push進去,程式碼為 01.- (void) loginSuccess 02.{ 03.// 進入主介面,改變根檢視 04.NSMutableArray* viewArray = [[NSMutableArray alloc] init]; 05. 06.// 導航控制器+表標籤欄控制器相結合使用, 07.// 每個標籤有一個根導航控制器 08. 09.// 訊息 10.MessageViewController* msg = [[MessageViewController alloc] init]; 11.UINavigationController* navControloler = [[UINavigationController alloc] init]; 12.[navControloler pushViewController:msg animated:YES]; 13.[viewArray addObject:navControloler]; 14. 15.// 聯絡人 16.ContactViewController* contact = [[ContactViewController alloc] init]; 17.navControloler = [[UINavigationController alloc] init]; 18.[navControloler pushViewController:contact animated:YES]; 19.[viewArray addObject:navControloler]; 20. 21.// 動態 22.FavoriteViewController* favorite = [[FavoriteViewController alloc] init]; 23.navControloler = [[UINavigationController alloc] init]; 24.[navControloler pushViewController:favorite animated:YES]; 25.[viewArray addObject:navControloler]; 26. 27.// 標籤欄控制器 28.UITabBarController* tabBarController = [[UITabBarController alloc] init]; 29.tabBarController.viewControllers = viewArray; 30. 31.#ifdef TABRoot 32.// 修改根檢視為標籤欄控制器 33.AppDelegate* appDelagete = [UIApplication sharedApplication].delegate; 34.appDelagete.window.rootViewController = tabBarController; 35.#else 36.// 把標籤欄檢視控制器push到導航欄控制器內 37.[self.navigationController pushViewController:tabBarController animated:YES]; 38.#endif 39.} 其效果如下所示