3.12  iPhone程序框架

总的来说iPhone程序有两类框架,一类是游戏框架,另一类是非游戏框架,这里介绍的是非游戏框架,即基于iPhone 用户界面标准控件的程序框架。

典型的iPhone程序包含一个Window和几个UIViewController,每个UIViewController管理多个UIView(可能是UITableView、UIWebView、UIImageView等),如图3-24所示。这些UIView之间如何进行层次迭放、显示、隐藏、旋转、移动等都由UIViewController进行管理,而UIViewController之间的切换,通常情况是通过UINavigationController、UITabBarController或UISplitViewController进行切换。接下来笔者会逐一介绍如何使用这三种Controller来切换你的UIViewController,以及在UIViewController中如何组织和管理你的各种UIView。

iOS第三方框架 iphone框架_框架

 


图3-24  iPhone程序框架示意图



3.12.1  使用UINavigationController组织和管理UIView

当你的程序具有层次化的工作流时,就比较适合使用UINavigationController来管理UIViewController,即用户可以从上一层界面进入下一层界面,在下一层界面处理完以后又可以简单地返回到上一层界面,UINavigationController使用堆栈的方式来管理UIViewController,进入下一层界面的代码如下

1. [self.navigationController pushViewController:
nextController animated:YES];


返回上一层界面的代码如下


1. [self.navigationController popViewControllerAnimated:YES];


如图3-25所示,屏幕左上方的"Animal List"按钮是返回按钮,注意这个返回按钮是UINavigationController自动添加的,不需要编写任何代码在界面上添加按钮或者实现按钮操作,当程序使用pushViewController()函数将ViewController添加进UINavigation Controller的时候,UINavigationController就自动显示这个返回按钮,用户单击这个"Animal List"按钮就可以回到原先的界面,UINavigationController的这种运行机制产生这样的效果,用户可以一层一层地进入更深的界面层次,然后又可以一层一层的按顺序返回,使用这样的方式来组织用户界面非常方便。

iOS第三方框架 iphone框架_uiview_02

 


图3-25  UINavigationController

程序框架实例界面

本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的Zoo实例。


3.12.2  使用UITabBarController组织和管理UIView

当你的程序分为几个相对比较独立的部分时,就比较适合使用UITabBarController来组织用户界面,如图3-26所示。

iOS第三方框架 iphone框架_iphone_03

 


图3-26  UITabBarController

程序框架实例界面

在屏幕的下方包含UITabBarController的三个按钮,用户单击不同的按钮即可以进入不同的界面,每个界面相对来说在整个系统中比较独立,也就是程序分成了三个相对比较独立的不同部分,在每个相对独立的部分你也可以使用UINavigationController等容器类组织你的界面。这样组织使程序逻辑非常清晰,当然你也可以组织很多个Tab而不只是三个,以下代码演示如何创建UITabBarController对象,并为其添加多个Tab。

1. - (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions: (NSDictionary *)launchOptions {  2.  
3.     // Override point for customization after application launch.  
4.  
5.     //Create the navigation Controller  
6.     UINavigationController *localNavigationController;  
7.     //Create UINavigationController  
8.     tabBarController = [[UITabBarController alloc] init];  
9.     tabBarController.delegate = self;  
10.     // Create the array that will contain all the View controlelr  
11.     NSMutableArray *localControllersArray =
[[NSMutableArray alloc] init WithCapacity:3];  12.     // Create the view controller attached
to the first item in the TabBar  13.  
14.     aViewController *firstViewController;  
15.     firstViewController = [aViewController alloc];  
16.     localNavigationController = [[
UINavigationController alloc] initWithRoot 
ViewController:firstViewController];  17.     localNavigationController.navigationBar.
barStyle = UIBarStyleBlackOpaque;  18.  
19.     [localNavigationController.tabBarItem initWithTitle:@"Outlines"  
20.     image:[UIImage imageNamed:@"webcast.png"] tag:1];  
21.     firstViewController.navigationItem.title = @"Outlines";  
22.  
23.     [localControllersArray addObject:localNavigationController];  
24.     [localNavigationController release];  
25.     [firstViewController release];  
26.  
27.     // Create the view controller attached to the
second item in the TabBar  28.  
29.     anotherViewController *secondViewController;  
30.     secondViewController = [[anotherViewController 
alloc] initWithStyle: UITableViewStyleGrouped ];  31.     localNavigationController = [[UINavigationController
alloc] initWithRoot ViewController:secondViewController];  32.     [localNavigationController.tabBarItem initWithTitle:@"Q & A"  
33.       image:[UIImage imageNamed:@"book.png"] tag:2];  
34.     secondViewController.navigationItem.title=@"Q & A";  
35.  
36.     [localControllersArray addObject:localNavigationController];  
37.     [localNavigationController release];  
38.     [secondViewController release];  
39.  
40.     miscViewController *thirdViewController;  
41.     thirdViewController = [[miscViewController alloc]
initWithStyle:UITable ViewStyleGrouped ];  42.     localNavigationController = [[UINavigationController
alloc] initWithRoot ViewController:thirdViewController];  43.     [localNavigationController.tabBarItem initWithTitle:@"Misc"  
44.       image:[UIImage imageNamed:@"favorites.png"] tag:3];  
45.     thirdViewController.navigationItem.title=@"Misc";  
46.  
47.     [localControllersArray addObject:localNavigationController];  
48.     [localNavigationController release];  
49.     [thirdViewController release];  
50.  
51.     // load up our tab bar controller with the view controllers  
52.     tabBarController.viewControllers = localControllersArray;  
53.  
54.     // release the array because the tab bar controller now has it  
55.     [localControllersArray release];  
56.     // add the tabBarController as a subview in the window  
57.     [window addSubview:tabBarController.view];  
58.  
59.     // need this last line to display the window (and tab bar controller)  
60.     [window makeKeyAndVisible];  
61.  
62.     return YES;  
63. }


捕获Tab切换事件,获取当前活动的Tab索引和UIViewController对象,代码如下

1. - (void)tabBarController:(UITabBarController *)
barController didSelectView Controller:
(UIViewController *)viewController{  2.  
3.     NSLog(@"currentController index:%d",viewController,
tabBarController.selectedIndex);  4.     UIViewController  *currentController =
tabBarController.selectedView Controller;  5.     NSLog(@"currentController: %@",currentController);  
6.  
7. }


切换不同的Tab时,只需要设置UITabBarController的selectedIndex属性即可,代码如下


    1. tabBarController.selectedIndex = 2;


    本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的Lessons2实例。



    3.12.3  使用UISplitViewController组织和管理UIView

    UISplitViewController属于iPad特有的界面控件,适合用于主从界面的情况(Master view→Detail view),Detail view跟随Master view进行更新,如图3-27所示,屏幕左边(Master View)是主菜单,单击每个菜单则屏幕右边(Detail View)就进行刷新,屏幕右边的界面内容又可以通过UINavigationController进行组织,以便用户进入Detail View进行更多操作,用户界面以这样的方式进行组织,使得程序内容清晰,非常有条理,是组织用户界面导航很好的方式,有关UISplitViewController的具体使用,将在后面的章节进行介绍。

    iOS第三方框架 iphone框架_iphone_04

     


    图3-27  UISplitViewController程序框架实例界面

    重要提示:UIView的tag属性在iPhone程序开发中非常重要,因为几乎所有的View之间的管理都是依靠tag来进行索引和查找。

    iPhone程序框架小结:

    (1)使用UIViewController组织和管理你的UIView;

    (2)使用.plist文件、Core Data或者自定义数据持久方式管理你的缓存和持久数据;

    (3)使用UINavigationController、UITabBarController,或者UISplitViewController管理你的UIViewController。

    练习:

    (1)通过View的tag属性对UIView进行管理。

    (2)通过UINavigationController对UIViewController进行管理。

    (3)通过UITabBar对UIViewController进行管理。

    (4)通过UISegmentControl对UIViewController进行管理。