天天看點

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

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

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

TableView的作用是在一張表格中展示資料,它是UISCrollView的子類,你會看到當table中的cell條目多的時候你可以通過上下滑動螢幕來擷取更多的内容。

table可以是靜态的也可以是動态的(比如一個table中item的數量)。

通過datasource和delegate可以創造出非常多樣化的table樣式。

在展示很大數量級的資料時table依然非常的有效。

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

這裡展示了動态和靜态兩種table,動态的table通常是某個比較長的list,你可以向其中增減條目,靜态table被用作某些功能項,這些功能項的位置都是固定的。

下面來看一下table的各部分,首先是表頭:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

tableView中有對應的屬性來管理這個表頭,有表頭當然就會有表尾,它們都是UIView:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

然後表格的内容都是放在section中的,section的數量需要實作datasource中對應的代理方法,并且這個方法是required的:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

section也有header和footer,中間的部分就是tableCell。

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

設定cell是一個很常用的代理方法,注意這個方法是datasource中的方法。

我們之前看到的都是Plain風格的table,下面是Grouped風格的table。

下面是有section和沒有section的table的差别:

cell本身有很多的種類,如下圖展示:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

或者使用你自己定義的格式。

你可以在對象庫中拖拽出一個TableViewController這種便捷類,我們知道ViewController中的底層view使用self.view來擷取,實際上tabelViewController中這個self.view就是一個UITableView,它的尺寸會充滿整個螢幕。

和之前相同,當我們使用這個storyboard中的tableview時我們需要關聯這個場景和某個UITableViewController的子類,使用編輯類的好處之一是,你所關聯的子類會成為這個tableView的datasource和delegate,而不需要手動去添加

<code>somTableView.delegate = self</code>

這樣的代碼。

你可以在屬性檢查器中設定tableView的屬性。

有幾個重要屬性需要關注一下,比如

style:可以設定Plain和Grouped

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

content:可以設定動态和靜态

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

注意設定成static(靜态)的話,你的tableView就隻能在storyboard中設定了,你可以向其中添加各種控件。

如果設定成Dynamic(動态),你可以在控制器的代碼中進行設定,通常動态的table使用Plain這種style。此時cell會被重複使用多次。

你可以編輯這些cell的格式,在試圖大綱中選中cell,此時屬性檢查器就切換到cell:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

比如這個Accessory,選擇不同的樣式,cell的右側就會出現不同的圖示,都是我們很常見的格式:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource
【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

如果使用了自定義的cell格式,你需要關聯cell和類UITableViewCell的某個子類。

然後打開聯合編輯器,在你新建立的子類中關聯cell中的元素:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

注意這裡的UITableViewCell不是一個控制器,是以它沒有控制器生命周期中的方法(比如viewDidLoad之類),它有一個方法awakeFromNib,這個方法會在storyboard中的布局之前被調用,你可以重寫另一個方法layoutSubviews,它會在頁面自動布局完成後才調用。

關于tableView:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

注意tableViewcontroller中有一個屬性tableView也就是self.view代表了控制器中的這張預設的表格。

datasource中有三個重要的方法是必須重寫的:它們規定了

1table中有多少個section

2每個section中有多少行

3指定一個view來繪制每個section中每一行的cell樣式

下面來說說cell的樣式問題:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

控制器會通過datasource的方法設定某個row的cell樣式。

在這個方法中你可以提前準備好一個用來展示的資料結構,它是一個二維的,可以取出對應的某個section和row的cell樣式:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

在建立cell的時候我們可以重用已有的cell格式:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

使用dequeued記錄一個可複用的cell的格式,但是注意上圖中我們顯式地标注出了它的類型,它使一個AnyObject類型的。在建立一個cell的時候,需要把這個dequeued的類型轉換成一個cell的類型,比如cell是一個非自定義的cell的時候,轉換成最基礎的UITableViewCell,之後就可以使用UITableViewCell的API了:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

對于一個自定義的cell:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

用法相同,也是用Identifier來複用,不同的是需要把類型轉換成它需要的類型,然後使用子類中的api:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

除了cellFor…這個方法,來看一下datasource中的另外兩個方法:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

section有預設值1,你不重寫這個方法,section的數量會被設定為1。但是row的數量是沒有預設值的,是以你必須重寫這個代理方法。

但是對于一個靜态的table,不要重寫這些方法,直接在storyboard中設定。

有了datasource,展示一個table就變得非常的簡單:

【我們都愛Paul Hegarty】斯坦福IOS8公開課個人筆記36 TableViewDatasource

包括section的title和footer。

繼續閱讀