自己動手寫iPhone wap瀏覽器之介面架構篇(手把手教你iphone開發 – 進階篇)

來源:互聯網
上載者:User

作者:孫東風 2009-12-28(轉載請註明出處)

在筆者的上篇文章《自己動手寫iPhone wap瀏覽器之BSD Socket引擎篇》中已經成功解析出來了wml頁面中的tag,如果讀者仔細的話可能會看到裡面中文的tag顯示為亂碼,這是因為在iPhone上預設的中文編碼格式是UTF-8,而通過BSD Socket請求過來的是ASCII碼,所以需要通過轉換為UTF-8格式,如下:

 

[[NSString alloc] initWithBytes:aChild->Value() length:strlen(aChild->Value()) encoding:NSUTF8StringEncoding]

 

經過轉換編碼之後,在螢幕上顯示的列印內容如下:

 

parse xml succeed

aChild value = STATUS OK

aChild value = card

TiXmlNode::ELEMENT name = title, attr value = 百度一下,你就知道

aChild value = p

aChild value = img

TiXmlNode::ELEMENT name = src, attr value = /r/wise/wapsearchindex/logoindexsmall.gif

TiXmlNode::ELEMENT name = alt, attr value = 百度首頁

aChild value = br

aChild value = input

TiXmlNode::ELEMENT name = name, attr value = word

TiXmlNode::ELEMENT name = emptyok, attr value = true

aChild value = br

aChild value = anchor

aChild value = 搜網頁

TiXmlNode::TEXT Value = 搜網頁

 

接下來的任務就是渲染這些解析出來的tag並顯示在介面上了,本篇裡筆者重點講述如果搭建一個可擴充的、健壯的介面架構。

 

在所有平台的介面架構中,筆者一直推崇MVC,MVC的著重點在於把介面顯示和資料處理分離開來以提供可擴充的介面架構平台。基於這個思想,筆者建立了如下的架構圖:

 

圖1.Tag介面架構圖

 

在Xml模組處理完xml資料並提取出tag後,交給CXmlControl進行處理,CXmlControl在這裡充當Control的角色,它負責在處理完tag(標籤)後產生相應的訊息以顯示在介面上。

 

其中CXmlControl繼承自UIView類,它負責顯示介面並響應使用者的按鍵訊息,而具體的邏輯處理則是在CXmlControlImpl類中進行的,CXmlControlImpl這個類負責管理產生的tag(標籤)以及tag(標籤)的介面Layout(布局),如下:

 

 

 

@class CXmlControlImpl;

@interface CXmlControl : UIView {

@public

         CXmlControlImpl* iImpl;

}

 

-(void) addElements:(CXmlElementImpl*)iElemntAdded;

 

-(CXmlElement*) InsertContent:(CXmlElement*)aTarget aPosition:(NSInteger)aPosition aSource:(const NSString*)aSource aFlags:(NSInteger)aFlags;

-(CXmlElement*) AppendContent:(const NSString*)aSource aFlags:(NSInteger)aFlags;

-(void) Refresh;

-(void) RefreshAndDraw;

-(void) ClearContent;

-(void) RemoveElement:(CXmlElement*)aElement;

-(CXmlElement*) Element:(const NSString*)aId aIndex:(NSInteger)aIndex;

-(CXmlElement*) ElementByTag:(const NSString*)aTagName aIndex:(NSInteger)aIndex;

-(CXmlElement*) FocusedElement;

-(void) SetFocusTo:(CXmlElement*)aElement;

-(void) ScrollToView:(CXmlElement*)aElement;

-(CXmlElement*) Body;

-(void) SetEventObserver:(id<MXmlCtlEventObserver>)aObserver;

-(CXmlElementImpl*) Impl;

-(CGContextRef) SystemGc;

 

-(void) Draw:(const CGRect)aRect;

 

-(CWritableBitmap*) OffScreenBitmap;

-(void) SetOffScreenBitmap:(CWritableBitmap*)aBitmap;

-(void) DrawOffscreen;

 

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

@end

 

Tag(標籤)類的基類為CXmlElement,它抽象了標籤的基本屬性和操作,在每一個派生自此基類的tag(標籤)類如CXmlTextElement、CXmlImgElement中都維護一個全域的布局類CHcMeasureStatus,每一個tag(標籤)類都負責自己的布局和自己的繪製操作,完成布局操作和繪製操作後為改變CHcMearuseStatus的狀態和屬性並傳遞給CXmlControl類。

 

在下一篇中筆者會嘗試解析並渲染常見的Text標籤,爭取在元旦之前完成吧:)

 

本教程的系列文章和代碼會被收錄在筆者的新書《手把手教你iPhone開發》中,所以任何形式的商業抄襲行為會被追究相應的責任。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.