• 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里):

    
    #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编辑器的添加代码块不太完善,因此在后面使用了屏幕快照的方式,还请读者谅解。
  • 相关阅读:
    【项目一 · 直播】 ☞ 3. 推流直播
    【项目一 · 直播】 ☞ 2. 拉流直播
    【Objective-C 篇】 ☞ 10. 代理设计模式
    高精度模板
    csp每日习题
    pat乙级每日习题
    dp-LIS LCS 模型
    线性dp
    归并排序应用-求逆序对数量
    dp-位移模型(数字三角形演变)
  • 原文地址:https://www.cnblogs.com/zhaopengtao14/p/3734914.html
Copyright © 2020-2023  润新知