iOS程序设计的两种框架模式
随着对iOS的不断了解和深入,我们可以设计很多的小工程,然而对工程的构架成了我们很是费时费神的事情。一个好的构架能给工程带来很大的益处,也能让用户有很好的体验。本文以微博为例,介绍两种自己经常使用的框架,希望读者能给出意见,提出框架测试的Bug,多多留言,以便共同探讨。
微博的基本画面跳转介绍:
大家都知道,微博第一次登陆的时候有个用户指引界面,点击体验按钮进入了用户登陆界面,输入账号密码后点击登陆进入了用户的主界面,主界面是一个UITabBarViewController,控制下一级界面的四个UINavigationController(暂认为四个下级界面分别为:微博、联系人、发现和关于),四个NavigationController分别控制四个与自己的RootViewController内容相关的ViewController进行管理其下一级界面。
当用户非第一次登陆时候分两种情况:一、用户登陆时记住了密码,二、用户登陆时不选择记住密码。用户选择登陆记住密码则一运行程序就进入了主界面,如果非记住密码状态,则要先进入登陆界面,点击登陆后进入主界面。
在主界面的关于界面有注销按钮,点击注销按钮则返回到登陆界面。
第一种框架
如图1-(1)所示,为界面转换的大致流程:
图1-(1)
工程的self.window的RootViewController是一个UINavigationController对象nav,nav的rootViewController是UIHomeViewController,判断是否是第一次登陆,如果是第一次登陆则self的导航控制器push用户指引界面的视图控制器(UIUserGuideViewController对象),然后点击登陆进入Login界面(self的NavigationController推入UILoginViewController的对象)。代码如下(写在UIAppDelegate.m里):
```objc
import "QYAppDelegate.h"
import "QYHomeViewController.h"
import "QYUserGuideViewController.h"
@implementation QYAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{ if (![[NSUserDefaults standardUserDefaults] boolForKey:@"everLanched"])
{
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"everLanched"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"firstLanched"];
}else
{
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"firstLanched"];
}
[[NSUserDefaults standardUserDefaults] synchronize];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
QYHomeViewController *rootViewController = [[QYHomeViewController alloc] init];
self.nav = [[UINavigationController alloc]initWithRootViewController:rootViewController];
self.nav.navigationBarHidden = YES;
self.window.rootViewController = self.nav;
if ([[NSUserDefaults standardUserDefaults] boolForKey:@"firstLanched"])
{
QYUserGuideViewController *userGuideController = [[QYUserGuideViewController alloc]init];
[self.nav pushViewController:userGuideController animated:YES];
}
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
```
一下的程序本文不再赘述,相信读者自己都能根据跳转的关系进行完善,下面给出框架的快照图1-(2)
第二种框架结构
如下图:本方法主要是在第一中方法中的提炼,由上面的框架可知,主界面,用户指引界面和登陆界面之间的关系耦合性比较高,且逻辑较为复杂。这种框架的基本点是创建一个类用于管理以上三个界面的切换,原理是更换UIApplecationDelegate的self.window的rootViewController来进行视图间的切换。首先创建一个继承自NSObject的类mainViewController.具体的程序如下图2-(1)、2-(2); 图2-(1) .h文件 图2-(2) .m文件
然后调用该类的静态方法进行rootViewController的更改;
总结
第一种方法相对于第二种方法来说,各个ViewController之间的耦合关系很紧密,且视图之间的跳转关系比较复杂,多少违背了高内聚低耦合的编程思想风格。第二种方法,运用一个类去管理各个界面的ViewController,以改变self.window 的rootViewController,达到视图的切换,使其之间的耦合性降低,且界面跳转关系一目了然。然而rootViewControl并没有官方文档明确说明是否可以更改,有可能会带来稍小的问题,但目前尚未发现。