不看后悔的:iOS开发系列--视图切换(1)

在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将一一介绍:UITabBarController,UINavigation,Controller模态窗口

AD:2014WOT全球软件技术峰会北京站 课程视频发布

11月21日-22日 与WOT技术大会相约深圳 现在抢票

iOS三种视图切换的原理各不相同:

UITabBarController:以平行的方式管理视图,各个视图之间往往关系并不大,每个加入到UITabBarController的视图都会进行初始化即使当前不显示在界面上,相对比较占用内存。
UINavigationController:以栈的方式管理视图,各个视图的切换就是压栈和出栈操作,出栈后的视图会立即销毁。
UIModalController:以模态窗口的形式管理视图,当前视图关闭前其他视图上的内容无法操作。

UITabBarController是Apple专门为了利用页签切换视图而设计的,在这个视图控制器中有一个UITabBar控件,用户通过点击tabBar进行视图切换。我们知道在UIViewController内部有一个视图,一旦创建了UIViewController之后默认就会显示这个视图,但是UITabBarController本身并不会显示任何视图,如果要显示视图则必须设置其viewControllers属性(它默认显示viewControllers[0])。这个属性是一个数组,它维护了所有UITabBarController的子视图。为了尽可能减少视图之间的耦合,所有的UITabBarController的子视图的相关标题、图标等信息均由子视图自己控制,UITabBarController仅仅作为一个容器存在。

不看后悔的:iOS开发系列--视图切换(1)_第1张图片

假设现在有一个KCTabBarViewController(继承于UITabBarController),它内部有一个KCWebChatViewController、一个KCContactViewController。

1.首先创建一个KCTabBarViewController继承于UITabBarController(代码是默认生成的,不再贴出来)。

2.其次创建两个子视图,在这两个子视图控制器中设置对应的名称、图标等信息。

KCWebChatViewController.m

    
    
    
    
  1.  KCWorldClockViewController.m 
  2. //  ViewTransition 
  3. // 
  4. //  Created by Kenshin Cui on 14-3-15. 
  5. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. 
  6. // 
  7.  
  8. #import "KCWebChatViewController.h" 
  9.  
  10. @interface KCWebChatViewController () 
  11.  
  12. @end 
  13.  
  14. @implementation KCWebChatViewController 
  15.  
  16. - (void)viewDidLoad { 
  17.     [super viewDidLoad]; 
  18.      
  19.     self.view.backgroundColor=[UIColor redColor]; 
  20.      
  21.     //设置视图控制器标题 
  22.     self.title=@"Chat"
  23.      
  24.     //注意通过tabBarController或者parentViewController可以得到其俯视图控制器(也就是KCTabBarViewController) 
  25.     NSLog(@"%i",self.tabBarController==self.parentViewController);//对于当前应用二者相等 
  26.      
  27.     //设置图标、标题(tabBarItem是显示在tabBar上的标签) 
  28.     self.tabBarItem.title=@"Web Chat";//注意如果这个标题不设置默认在页签上显示视图控制器标题 
  29.     self.tabBarItem.image=[UIImage imageNamed:@"tabbar_mainframe.png"];//默认图片 
  30.     self.tabBarItem.selectedImage=[UIImage imageNamed:@"tabbar_mainframeHL.png"];//选中图片 
  31.      
  32.     //图标右上角内容 
  33.     self.tabBarItem.badgeValue=@"5"
  34.      
  35. @end 
  36.  
  37. KCContactViewController.m 
  38.  
  39. // 
  40. //  KCAlarmViewController.m 
  41. //  ViewTransition 
  42. // 
  43. //  Created by Kenshin Cui on 14-3-15. 
  44. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. 
  45. // 
  46.  
  47. #import "KCContactViewController.h" 
  48.  
  49. @interface KCContactViewController () 
  50.  
  51. @end 
  52.  
  53. @implementation KCContactViewController 
  54.  
  55. - (void)viewDidLoad { 
  56.     [super viewDidLoad]; 
  57.     self.view.backgroundColor=[UIColor yellowColor]; 
  58.  
  59.     self.tabBarItem.title=@"Contact"
  60.     self.tabBarItem.image=[UIImage imageNamed:@"tabbar_contacts.png"]; 
  61.     self.tabBarItem.selectedImage=[UIImage imageNamed:@"tabbar_contactsHL.png"]; 
  62.  
  63.  
  64. @end 

3.在应用程序启动后设置Tab bar视图控制器的子视图,同时将Tab bar视图控制器作为window的根控制器。

AppDelegate.m

    
    
    
    
  1. // 
  2. //  AppDelegate.m 
  3. //  ViewTransition 
  4. // 
  5. //  Created by Kenshin Cui on 14-3-15. 
  6. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. 
  7. // 
  8.  
  9. #import "AppDelegate.h" 
  10. #import "KCTabBarViewController.h" 
  11. #import "KCWebChatViewController.h" 
  12. #import "KCContactViewController.h" 
  13.  
  14. @interface AppDelegate () 
  15.  
  16. @end 
  17.  
  18. @implementation AppDelegate 
  19.              
  20.  
  21. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  22.      
  23.     _window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; 
  24.      
  25.     KCTabBarViewController *tabBarController=[[KCTabBarViewController alloc]init]; 
  26.      
  27.     KCWebChatViewController *webChatController=[[KCWebChatViewController alloc]init]; 
  28.     KCContactViewController *contactController=[[KCContactViewController alloc]init]; 
  29.     tabBarController.viewControllers=@[webChatController,contactController]; 
  30.     //注意默认情况下UITabBarController在加载子视图时是懒加载的,所以这里调用一次contactController,否则在第一次展示时只有第一个控制器tab图标,contactController的tab图标不会显示 
  31.     for (UIViewController *controller in tabBarController.viewControllers) { 
  32.         UIViewController *view= controller.view; 
  33.     } 
  34.      
  35.     _window.rootViewController=tabBarController; 
  36.     [_window makeKeyAndVisible]; 
  37.      
  38.     return YES; 
  39.  
  40. - (void)applicationWillResignActive:(UIApplication *)application { 
  41.     // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
  42.     // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
  43.  
  44. - (void)applicationDidEnterBackground:(UIApplication *)application { 
  45.     // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
  46.     // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
  47.  
  48. - (void)applicationWillEnterForeground:(UIApplication *)application { 
  49.     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
  50.  
  51. - (void)applicationDidBecomeActive:(UIApplication *)application { 
  52.     // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
  53.  
  54. - (void)applicationWillTerminate:(UIApplication *)application { 
  55.     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
  56.  
  57. @end 

不看后悔的:iOS开发系列--视图切换(1)_第2张图片

不看后悔的:iOS开发系列--视图切换(1)_第3张图片

对于UITabBarController简单总结如下:

UITabBarController会一次性初始化所有子控制器,但是默认只加载第一个控制器视图,其他视图控制器只初始化默认不会加载,为了 能够将其他子控制器也正常显示在Tab bar中我们访问了每个子视图控制器的视图以便调用其视图加载方法(viewDidLoad)。

每个视图控制器都有一个tabBarController属性,通过它可以访问所在的UITabBarController,而且对于UITabBarController的直接子视图其tabBarController等于parentViewController。

每个视图控制器都有一个tabBarItem属性,通过它控制视图在UITabBarController的tabBar中的显示信息。

tabBarItem的image属性必须是png格式(建议大小32*32)并且打开alpha通道否则无法正常显示。

UINavigationController

你可能感兴趣的:(不看后悔的:iOS开发系列--视图切换(1))