Three20 模组架构简介

来源:互联网 发布:数控磨床怎么编程 编辑:程序博客网 时间:2024/06/11 00:15
整体架构图

如前述,Three20已经分为模组化的架构,开发者可以自由选择所需要的模组加入到专案中,但这些模组之间有一些相依性的问题,阶层的架构如下:
------------------------------------------
|                    UI                  |
------------------------------------------
| UINavigator  |            |   Style    |
|--------------|            |------------|
|   UICommon   |            |  Network   |
------------------------------------------
|                   Core                 |
------------------------------------------

如图上所见,如果我们要使用Three20Style这个framework的话,就会一并加入Three20Network和Three20Core这两个必备的底层framework。但我们不需要担心是否要自行加入这些相依的framework,因为在Three20的各framework内部就有作相关的设定了,我们只需要加入想要使用的framework即可。

Three20Core

Three20Core是整个Three20中最底层的framework,所有的framework均相依于这个framework。在Three20Core中提供了许多常用的helper method、Macro,还有对Cocoa Touch的内建类别透过Category新增一些额外的方法。

以下列举几个在Three20中常出现的共用方法、函式:

    * TT_RELEASE_SAFELY(POINTER); – 将物件release后一并将POINTER = nil;
    * BOOL TTIsStringWithAnyText(id object); – 检查物件是否为字串、字串内是否有内容,另有NSSet、NSArray的版本
    * NSMutableArray* TTCreateNonRetainingArray(); – 建立一个新的NSMutableArray但不会自动retain加入的物件,在delegate中相当实用
    * NSString* TTPathForBundleResource(NSString* relativePath); – 取得Bundle中特定档案的path
    * NSString* TTPathForDocumentsResource(NSString* relativePath); – 取得documents中特定的档案path

而针对Foundation类别也有许多新增,以下列举几个:

    * NSArray
          o - (void)perform:(SEL)selector; – 对阵列中的每个物件呼叫selector
    * NSData
          o - (NSString*)md5Hash; – 取得资料的md5 hash
    * NSMutableArray
          o - (void)addNonEmptyString:(NSString*)string; – 加入字串并检查该字串是否有内容
    * NSString
          o - (BOOL)isWhitespaceAndNewlines; – 字串是否为空白或换行字元
          o - (NSDictionary*)queryDictionaryUsingEncoding:(NSStringEncoding)encoding; – 将URL字串parse为query dictionary
          o - (NSString*)stringByRemovingHTMLTags; – 移除字串中的html tags
          o - (NSString*)md5Hash; – 取得字串的md5 hash

Three20Network

Three20Network主要提供了TTURLRequest类别,相对于Cocoa内建的NSURLRequest而言,此类别有以下特点:

    * 支援各种HTTP methods
    * 提供修改各种header参数
    * 加入字串、档案作为parameters
    * 完整的cache机制
    * 自动parse response并验证回传资料
    * 处理cookies

伴随着TTURLRequest,Three20Network中也有TTURLResponse类别及Protocol、TTURLCache等类别,有兴趣的读者可以自行阅读相关原始码。

Three20UICommon

Three20Core是Three20中的基础,则Three20UICommon则是Three20中UI介面相关类别、函式的基础了。此类别仍然包含了许多方便的helper方法、Macro,也对UIKit的现有类别加入许多方法。

以下列举Three20UICommon中的几个方法,主要是以各种判断为主:

    * float TTOSVersion(); – 回传iPhone OS版本
    * BOOL TTIsKeyboardVisible(); – 检查Keyboard是否在画面上
    * BOOL TTIsPhoneSupported(); – 是否有iPhone
    * UIDeviceOrientation TTDeviceOrientation(); – 目前的装置方向
    * void TTAlert(NSString* message); – 简化版的UIAlertView

至于对UIKit的新增方法,以UIWindow为例:

    * - (UIView*)findFirstResponder; – 寻找目前的First Responder,也就是目前虚拟键盘的对应物件
    * - (UIView*)findFirstResponderInView:(UIView*)topView; – 同上,不过从某个UIView开始往subviews找

小结

在此篇文章中介绍了Three20的架构及底层三个模组的用途,在下一篇文章中笔者将继续探讨Three20的上层模组,以及XML、JSON两个附属的额外模组,还请各位多多指教


Three20UINavigator

在Three20中一个很重要的创新突破便是URL-based navigation,透过这个机制我们可以将程式中原本切换画面(Push、ModalView、TabBar)的繁琐程式码,简化为开启URL的动作。这个概念对Web开发者而言应该相当熟悉,诚如我们在Three20介绍文章中提到过,Three20的诞生起源于Facebook的iPhone版应用程式,所以我们很容易在Three20这个framework中看到许多关于Web framework的概念。在Three20UINavigator中我们可以看到以下类别:

    * TTBaseNavigator – 负责开启URL的工作,只有部份功能、完整的TTNavigator则包含在Three20UI中
    * TTURLAction – 除了要开启的URL位置外,也有一些其他的Property可以设定、作为开启URL的选项
    * TTURLMap – 负责URL与View Controllers之间的转换、Mapping

除此之外,Three20UINavigator也有提供一些取得Frame、Bounds以及状态列高度的方法,有兴趣的读者可以参考TTGlobalNavigatorMetrics.h这只档案中的内容。 URL-Based Navigation的内容较多,笔者会在未来另外撰文解释、说明。

Three20Style

除了上述提到的URL-based Navigation外,Three20也引入了一个在Web开发上相当常见的Stylesheet概念。一般而言,我们若是在iPhone上面设计使用者介面时,必须针对每一个UI元件手动设定样式,像是文字的字体、大小,或者是工具列的颜色等等。然而透过TTStyle和TTStyleSheet的设定,就可以免除我们每次重复设定UI元件样式的麻烦。此外,也有TTStyleLayout、TTStyleText等相关的类别,和一些UIKit的新增方法,像是:

    * UIImage
          o - (UIImage*)transformWidth:(CGFloat)width height:(CGFloat)height rotate:(BOOL)rotate; – 转换图片大小、旋转图片
          o - (void)drawInRect:(CGRect)rect radius:(CGFloat)radius; – 画出有圆角的图案
    * UIColor
          o - (UIColor*)highlight; – 回传一个比现有颜色在更亮的颜色
          o - (UIColor*)shadow; – 同上,不过相反地回传一个较暗的颜色
          o - (UIColor*)copyWithAlpha:(CGFloat)newAlpha; – 回传一个同样的颜色,但alpha不同

关于Style的部份的内容笔者也同样会另外撰文介绍,敬请期待。

Three20UI

在先前framework的层层堆叠后,总算是到了最上层、也是最重要的Three20UI了。 Three20UI这个framework中包含了相当多的类别,大概可以分成三类:

    * UIKit内建类别的新增方法
    * Three20新增的View Controllers
    * Three20新增的UI元件

以UIKit的新方法而言, 以下几个是比较有趣、值得注意的:

    * UINavigationController
          o - (void)pushViewController:(UIViewController*)controller animatedWithTransition:(UIViewAnimationTransition)transition; – 加入新的Controller、但是使用非预设的动画效果
          o - (UIViewController*)popViewControllerAnimatedWithTransition:(UIViewAnimationTransition)transition; – 同上、但是是移除Controller
    * UITabBarController
          o - (void)setTabURLs:(NSArray*)URLs; – 传入一组URL作为tabs
    * UITableView
          o - (void)scrollToTop:(BOOL)animated; – 将Table卷动到最上方
          o - (void)scrollFirstResponderIntoView; – 卷动到目前开启虚拟键盘的元件
    * UIView
          o - (void)removeAllSubviews; – 移除全部subviews
    * UIWebView
          o - (CGRect)frameOfElement:(NSString*)query; – 回传某DOM物件的frame,传入值为一JavaScript expression

而Three20UI中所提供的额外View Controllers也是相当的丰富,像是:

    * TTViewController – Three20所使用的View Controller基础类别
    * TTWebViewController – 一个功能完整的网页浏览Controller
    * TTActionSheetController – 将UIActionSheet包装成Controller的形式,传入URL作为按钮
    * TTAlertController – 同上,将UIAlertView包装成Controller方便使用

原创粉丝点击