presentViewController:
使用場(chǎng)景
- 模態(tài)的展現(xiàn)另一個(gè)UIViewController
基本用法(OC)
[viewControllerA presentViewController:viewcontrollerB animated:YES completion:^{
NSLog(@"從viewControllerA切換到viewControllerB");
];
注意侯繁,這個(gè)completion block是當(dāng)viewControllerB的viewDidAppear方法執(zhí)行完畢之后疹味,執(zhí)行的术徊。
多說(shuō)點(diǎn)
viewController有兩個(gè)屬性跟這個(gè)方法關(guān)聯(lián)盖腕,一個(gè)是presentedViewController钝域,一個(gè)是presentingViewController.就拿上面的例子來(lái)說(shuō),
viewControllerA.presentedViewController = viewControllerB,
viewControllerB.presentingViewController = viewControllerA
這個(gè)關(guān)系執(zhí)行presentViewController時(shí)就確定了舶胀。當(dāng)你需要從B跳轉(zhuǎn)回A時(shí)概说,在B調(diào)用以下方法即可
[viewControllerB dismissViewControllerAnimation:YES completion:^{
NSLog(@"從viewControllerB切回到viewControllerA");
];如果你接連presentViewController多次呢碧注?比如嚣伐,A->B->C->D,這個(gè)時(shí)候會(huì)有一個(gè)棧,A處于棧底萍丐,D處于棧頂轩端。當(dāng)你需要從D跳轉(zhuǎn)到A時(shí),需要在A中調(diào)用dismissViewControllerAnimation:,這樣D會(huì)執(zhí)行dismiss animation逝变,而B(niǎo)基茵,C,D都會(huì)從占中移除壳影。
transitionFromViewController
使用背景
- 用于container viewController的兩個(gè)子view controller之間的切換
基本用法
若viewControllerA有兩個(gè)childViewController拱层, viewControllerB跟viewControllerD,當(dāng)前viewControllerB的view在父ViewController的View層級(jí)中宴咧。
[viewControllerA transitionFromViewController:viewControllerB
toViewController:viewControllerA
duration:0.25
opitions:UIViewAnimationOpitionsNone
animations:NO
completion:^{
NSLog(@"viewControllerB從A中移除根灯,viewControllerD在A中");
];
多說(shuō)點(diǎn)
- 在A中,依次從B轉(zhuǎn)到了C掺栅,再轉(zhuǎn)到了D烙肺。那么銷毀的順序則是,D氧卧,C桃笙,B,A沙绝,很像棧的順序搏明。
- 其實(shí)這個(gè)方法的就是把當(dāng)前ViewController的view從父viewController的view層級(jí)中移除鼠锈,添加上to viewController的view。
- 跟這個(gè)方法關(guān)聯(lián)的屬性說(shuō)兩個(gè)吧星著。一個(gè)是parentViewController脚祟,如viewControllerB的parentViewController是viewControllerA。一個(gè)是childViewControllers强饮,這個(gè)屬性是一個(gè)數(shù)組由桌,包含所有viewControllerA的child viewController。
- 還有其他兩個(gè)方法也很重要邮丰。一個(gè)是addChildViewController行您,添加child ViewController,如
[viewControllerA addChildViewController:viewControllerB];
一個(gè)是removeFromParentViewController剪廉,如:
[childViewControllerB removeFromParentViewController];
UINavigationController
使用背景
UINavigationController是一個(gè)很重要的ViewController容器娃循。完全可以單寫(xiě)一篇文章來(lái)解析。但是今天只說(shuō)viewController之間的切換吧斗蒋。UINavigationController管理了ViewController之間的層級(jí)關(guān)系捌斧,依照棧的模式來(lái)工作∪矗可以參照下iPhone中的設(shè)置應(yīng)用捞蚂,一層一層往下跳轉(zhuǎn)。
基本用法
假設(shè)有UINavigationController A跷究, UIViewController B姓迅,C,D俊马,A初始化的時(shí)候指定rootViewController為 B丁存。
-
從B跳轉(zhuǎn)到C ,C跳轉(zhuǎn)到D
[B.navigationController pushViewController:C animated:YES];
C入棧
[C.navigationController pushViewController:D animated:YES];
D入棧
彈出D柴我,D出棧
[D.navigationController popViewControllerAnimated:YES];直接跳轉(zhuǎn)到rootViewController
[D.navigationController popToRootViewControllerAnimated:YES];-
跳轉(zhuǎn)到棧中已存在的某個(gè)ViewController
[D.navigationController popToViewController:B animated:YES];
多說(shuō)點(diǎn)
UINavigationController繼承自UiViewController解寝,扮演導(dǎo)航控制器的角色。你呈現(xiàn)的是他的rootViewController艘儒,并維護(hù)一個(gè)stack聋伦,可以訪問(wèn)viewControllers屬性獲取其棧中的viewController。
UIViewController有一個(gè)navigationController的屬性彤悔,指向其所屬的導(dǎo)航控制器嘉抓。
導(dǎo)航控制器還有兩個(gè)有意思的組件,一個(gè)是導(dǎo)航欄晕窑,一個(gè)是底部工具欄抑片,這個(gè)以后專門寫(xiě)一篇文章來(lái)說(shuō)吧。
UITabBarController
使用背景
像微信那種杨赤,應(yīng)用底部會(huì)有<=5個(gè)的按鈕的使用場(chǎng)景敞斋。這種應(yīng)用也很常見(jiàn)截汪。一般情況下我們只需要初始化UITabBarController的每個(gè)tab對(duì)應(yīng)的root view controller,那么點(diǎn)擊底部tab的時(shí)候植捎,就會(huì)自動(dòng)跳轉(zhuǎn)到每個(gè)tab對(duì)應(yīng)的root view衙解。UITabBarController也是繼承自UIViewController,他的root view 可以分為兩個(gè)模塊焰枢,一個(gè)是底部的tab bar蚓峦,一個(gè)是底部上層的content view,點(diǎn)擊tab時(shí)济锄,就會(huì)看到content view 中的view之間的切換暑椰。
基本用法
這里的基本用法就是關(guān)于UITabBarController的一些初始化了。UITabBarController有一個(gè)viewControllers的屬性荐绝,是每個(gè)tab對(duì)應(yīng)的UIViewController的數(shù)組一汽,每個(gè)viewController包含一個(gè)UITabBarItem的屬性,定義每個(gè)tab的title低滩,image召夹,badgeValue等屬性。badgeValue就像微信消息那個(gè)tab對(duì)應(yīng)的未讀消息數(shù)恕沫。
viewController1.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"One"
image:nil
tag:1];
viewController2.tabBarItem = [[UITabBarItem alloc] initWithTitle:@"Second"
image:nil
tag:2];
tabBarController.viewControllers = [NSArray arrayWithObjects:viewController1,viewController2,nil];
多說(shuō)點(diǎn)
UITabBarController的viewControllers是copy屬性监憎,UINavigationController中的viewControllers是readonly。畢竟在UITabBarController中昏兆,viewControllers是暴露給外界添加child view controller的唯一接口枫虏。后期不知道蘋(píng)果會(huì)不會(huì)對(duì)UITabBarController的公共接口迭代更新。
在UITabBarController中爬虱,可以通過(guò)selectedViewController,selectedIndex兩個(gè)屬性獲取當(dāng)前選中的viewController腾它。
在項(xiàng)目中跑筝,UITabBarController跟UINavigationContorller經(jīng)常會(huì)搭配使用,比如UITabBarController每個(gè)tab的rootViewController就是一個(gè)UINavigationController瞒滴。