導航欄控制器和標籤欄控制器(UINavigationController和UITabBarController)混用
阿新 • • 發佈:2018-12-30
很多時候,在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.
}
其效果如下所示