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。
图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的这种运行机制产生这样的效果,用户可以一层一层地进入更深的界面层次,然后又可以一层一层的按顺序返回,使用这样的方式来组织用户界面非常方便。
图3-25 UINavigationController 程序框架实例界面 |
本节相关的完整Xcode工程源代码文件请参考本书附带的光盘中的Zoo实例。
3.12.2 使用UITabBarController组织和管理UIView
当你的程序分为几个相对比较独立的部分时,就比较适合使用UITabBarController来组织用户界面,如图3-26所示。
图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的具体使用,将在后面的章节进行介绍。
图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进行管理。