Three20 模組架構簡介

整體架構圖

如前述,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方便使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章