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不能讓人像作文一樣發揮,它給程式設計師的是填空題,問你:
- numberOfSectionInTableView(Table內有幾個section?)
- tableView:numberOfRowsInSection:(一個section裡有幾個row?)
- tableView:cellForRowAtIndexPath:(每一個cell的內容是什麼?)
numberOfSectionInTableView、tableView:numberOfRowsInSection:不難了解,但如何用tableView:cellForRowAtIndexPath:傳遞每一個cell的內容?是怎麼辦到的?
以下即為RootViewController骨幹的重點說明:
@interface RootViewController:
以下RootViewController各行都是由Xcode自動產生,RootViewController是個UITableViewController,UITableViewController inherit自UIViewController:UIResponer:NSObject,所以,基本上,UITableViewController具有一切UIViewController的特性,例如:initWithNibName:bundle、loadView、title、navigationItem、setToolbarItems:animated:...,除此之外再加上UITableViewController的兩個特性,initWithStyle、tableView,由此可知UITableViewController只有兩個method,其實,它真正的威力在於conforms to UITableViewDelegate及UITableViewDataSource兩個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)