TableView是iOS開發中非常重要的内容。

TableView的作用是在一張表格中展示資料,它是UISCrollView的子類,你會看到當table中的cell條目多的時候你可以通過上下滑動螢幕來擷取更多的内容。
table可以是靜态的也可以是動态的(比如一個table中item的數量)。
通過datasource和delegate可以創造出非常多樣化的table樣式。
在展示很大數量級的資料時table依然非常的有效。
這裡展示了動态和靜态兩種table,動态的table通常是某個比較長的list,你可以向其中增減條目,靜态table被用作某些功能項,這些功能項的位置都是固定的。
下面來看一下table的各部分,首先是表頭:
tableView中有對應的屬性來管理這個表頭,有表頭當然就會有表尾,它們都是UIView:
然後表格的内容都是放在section中的,section的數量需要實作datasource中對應的代理方法,并且這個方法是required的:
section也有header和footer,中間的部分就是tableCell。
設定cell是一個很常用的代理方法,注意這個方法是datasource中的方法。
我們之前看到的都是Plain風格的table,下面是Grouped風格的table。
下面是有section和沒有section的table的差别:
cell本身有很多的種類,如下圖展示:
或者使用你自己定義的格式。
你可以在對象庫中拖拽出一個TableViewController這種便捷類,我們知道ViewController中的底層view使用self.view來擷取,實際上tabelViewController中這個self.view就是一個UITableView,它的尺寸會充滿整個螢幕。
和之前相同,當我們使用這個storyboard中的tableview時我們需要關聯這個場景和某個UITableViewController的子類,使用編輯類的好處之一是,你所關聯的子類會成為這個tableView的datasource和delegate,而不需要手動去添加
<code>somTableView.delegate = self</code>
這樣的代碼。
你可以在屬性檢查器中設定tableView的屬性。
有幾個重要屬性需要關注一下,比如
style:可以設定Plain和Grouped
content:可以設定動态和靜态
注意設定成static(靜态)的話,你的tableView就隻能在storyboard中設定了,你可以向其中添加各種控件。
如果設定成Dynamic(動态),你可以在控制器的代碼中進行設定,通常動态的table使用Plain這種style。此時cell會被重複使用多次。
你可以編輯這些cell的格式,在試圖大綱中選中cell,此時屬性檢查器就切換到cell:
比如這個Accessory,選擇不同的樣式,cell的右側就會出現不同的圖示,都是我們很常見的格式:
如果使用了自定義的cell格式,你需要關聯cell和類UITableViewCell的某個子類。
然後打開聯合編輯器,在你新建立的子類中關聯cell中的元素:
注意這裡的UITableViewCell不是一個控制器,是以它沒有控制器生命周期中的方法(比如viewDidLoad之類),它有一個方法awakeFromNib,這個方法會在storyboard中的布局之前被調用,你可以重寫另一個方法layoutSubviews,它會在頁面自動布局完成後才調用。
關于tableView:
注意tableViewcontroller中有一個屬性tableView也就是self.view代表了控制器中的這張預設的表格。
datasource中有三個重要的方法是必須重寫的:它們規定了
1table中有多少個section
2每個section中有多少行
3指定一個view來繪制每個section中每一行的cell樣式
下面來說說cell的樣式問題:
控制器會通過datasource的方法設定某個row的cell樣式。
在這個方法中你可以提前準備好一個用來展示的資料結構,它是一個二維的,可以取出對應的某個section和row的cell樣式:
在建立cell的時候我們可以重用已有的cell格式:
使用dequeued記錄一個可複用的cell的格式,但是注意上圖中我們顯式地标注出了它的類型,它使一個AnyObject類型的。在建立一個cell的時候,需要把這個dequeued的類型轉換成一個cell的類型,比如cell是一個非自定義的cell的時候,轉換成最基礎的UITableViewCell,之後就可以使用UITableViewCell的API了:
對于一個自定義的cell:
用法相同,也是用Identifier來複用,不同的是需要把類型轉換成它需要的類型,然後使用子類中的api:
除了cellFor…這個方法,來看一下datasource中的另外兩個方法:
section有預設值1,你不重寫這個方法,section的數量會被設定為1。但是row的數量是沒有預設值的,是以你必須重寫這個代理方法。
但是對于一個靜态的table,不要重寫這些方法,直接在storyboard中設定。
有了datasource,展示一個table就變得非常的簡單:
包括section的title和footer。