01a- Base Table

  • warning: Declaration of views_handler_argument::init(&$view, &$options) should be compatible with views_handler::init(&$view, $options) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_argument.inc on line 745.
  • warning: Declaration of views_handler_filter::options_validate(&$form, &$form_state) should be compatible with views_handler::options_validate($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter.inc on line 585.
  • warning: Declaration of views_handler_filter::options_submit(&$form, &$form_state) should be compatible with views_handler::options_submit($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter.inc on line 585.
  • warning: Declaration of views_handler_filter_boolean_operator::value_validate(&$form, &$form_state) should be compatible with views_handler_filter::value_validate($form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/handlers/views_handler_filter_boolean_operator.inc on line 149.
  • warning: Declaration of views_plugin_style_default::options(&$options) should be compatible with views_object::options() in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_style_default.inc on line 25.
  • warning: Declaration of views_plugin_row::options_validate($form, &$form_state) should be compatible with views_plugin::options_validate(&$form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_row.inc on line 135.
  • warning: Declaration of views_plugin_row::options_submit($form, &$form_state) should be compatible with views_plugin::options_submit(&$form, &$form_state) in /home/xnvgu7/public_html/sites/all/modules/views/plugins/views_plugin_row.inc on line 135.

iPhone SDK開發範例大全第五章之二Base Table(1/11):2009年10月06日星期二

iPhone SDK開發範例大全即iPhone Developer's CookBook的中文譯本,程式可由erica網站下載。第五章講Table,程式共有九個。

本文講第一個程式01a- Base Table,CookBook 中文譯本5-2、177~181頁(訣竅5-1):

(A) 這程式主要是做一個Table,Table內每一個cell是iPhone的一種font,click cell會在gdb console顯示該種font有幾種不同的變形(見(I))。

(B)Table是iPhone很有用的一種型態,程式01a- Base Table是一個已經完成的Table程式,猛一看,似乎要鍵入不少字,事實上,只要在Xcode內New Project,並選擇Navigation Based Application,之後的螢幕,給個project名字即可。

(C)假設project取名xTable,Xcode會產生如下圖的檔案,重要的有Classes內的

RootViewController.h、RootViewController.m

xTableAppDelegate.h、xTableAppDelegate.m

main.m

及其他的(見下圖Other Sources及Resources)

 

(D)接著,為了方便,將RootViewController.h、RootViewController.m、jTableAppDelegate.h、jTableAppDelegate.m((C)中用xTable為project名,現在我們用jTable為project名)的內容都copy到main.m中,並將(C)中的Classes folder整個去掉,也將不會用到的RootViewController.xib及MainWindow.xib去掉。這麼一來,我們所做的jTable project和書上及erica網站下載程式01a- Base Table具有相似的骨幹了。這時看一下Xcoed替我們做了什麼,見下圖右方,這些class及methods都是Xcode產生的,由@interface RootViewController 開始,主是 RootViewController、jTableAppDelegate、main()三項,RootViewController是主角,討論如下。

看RootViewController implemetation中有Regular methods(我加的comment)、Table View Methods(Xcode加上的comment),Table View Methods是主角,有三個程式,-numberOfSectionInTableView、-tableView:numberOfRowsInSection:、-tableView:cellForRowAtIndexPath:,這三個method是建立Table必需要的。

問題是,不是一看就能明白為何這樣子就能建好一個Table了。照理,不是該alloc、init什麼TableView等等的?的確不是!原因如下:

iPhone SDK提供非常強大的Table功能,很多都是"自動"的!因此,iPhone SDK掌握著建Table的控制權,打個比方,iPhone SDK不能讓人像作文一樣發揮,它給程式設計師的是填空題,問你:

  1. numberOfSectionInTableView(Table內有幾個section?)
  2. tableView:numberOfRowsInSection:(一個section裡有幾個row?)
  3. tableView:cellForRowAtIndexPath:(每一個cell的內容是什麼?)

numberOfSectionInTableView、tableView:numberOfRowsInSection:不難了解,但如何用tableView:cellForRowAtIndexPath:傳遞每一個cell的內容?是怎麼辦到的?

  1. 首先,既然有好多個cell,立刻想到NSArray,程式設計師必需先有一個NSArray,可以自己做好,也可以用現成的(例如本例即是用[UIFont familyNames])。
  2. 其次,如何index NSArray呢?iPhone SDK裡有個系統提供的 indexPath object,它是屬於NSIndexPath class,也是index NSArray的工具,iPhone系統自己可以用,程式設計師也可以用。
  3. tableView:cellForRowAtIndexPath:藉著NSArray及indexPath,每被call一次,傳回一個cell(程式設計師需負責)。

以下即為RootViewController骨幹的重點說明:

@interface RootViewController:

以下RootViewController各行都是由Xcode自動產生,RootViewController是個UITableViewControllerUITableViewController inherit自UIViewController:UIResponer:NSObject,所以,基本上,UITableViewController具有一切UIViewController的特性,例如:initWithNibName:bundle、loadView、title、navigationItem、setToolbarItems:animated:...,除此之外再加上UITableViewController的兩個特性,initWithStyle、tableView,由此可知UITableViewController只有兩個method,其實,它真正的威力在於conforms to UITableViewDelegateUITableViewDataSource兩個protocol。

UITableViewDelegate有許多處理Table的method,例如:tableView:heightForRowAtIndexPath:、tableView:accessoryButtontappedForRowWithIndexPath:、tableView:accessoryTypeForRowWithIndexPath:、tableView:didSelectRowAtIndexPath:、tableView:willBeginEditingRowAtIndexPath:、tableView:targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath: ...等。

UITableViewDataSource則提供了建構Table的method,例如:numberOfSectionInTableView、tableView:numberOfRowsInSection:、tableView:cellForRowAtIndexPath:這三個重要method及其他如tableView:titleForHeaderInSection:、tableView:canMoveRowAtIndexPath:等等。

@implementation RootViewController:RootViewController開始

---Regular methods:此為comment

-didReceiveMemoryWarning:這一個method是一般UIViewController均有的method。

-viewDidload:這一個method是一般UIViewController均有的method。

---Table View Methods:此為comment

-numberOfSectionInTableView:告知iPhone系統,有幾個section。

-tableView:numberOfRowsInSection::告知iPhone系統,每個section有幾個row。

-tableView:cellForRowAtIndexPath::將每個section的每一個row中的各個cell回傳給系統。

-dealloc

(E)在(D)裡,Xcode只activate了"必要的"method,事實上,Xcode準備好了下圖中這些method,只是將"非必要的"洗comment掉。

(F)照舊,SampleAppDelegate(若以jTable為project name,則為jTableAppDelegate)裡,要initWithRootViewController,其後的HelloController是程式01a- Base Table的,若是以jTable為project name,選Navigation Based Application,應為RootViewController(如(D)的圖示)。

(G)重點的HelloController(即前所說的RootViewController),在下圖中,如16行所言,這些是UITableViewDataSource,重點均以下黑線畫出。

(H)

(I)