首页 > 代码库 > iOS程序设计的两种框架模式

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并没有官方文档明确说明是否可以更改,有可能会带来稍小的问题,但目前尚未发现。

以上文档的程序代码,因为MarkDown编辑器的添加代码块不太完善,因此在后面使用了屏幕快照的方式,还请读者谅解。