看到右邊這個scroll bar的大小,就知道我沒把UITableViewDelegate全部demo完。
我自首,delegate裡面的東西真的好多,我看的好累啊QQ
一般tableViewDelegate所管理的內容如下:
table在即將為特定的row產生一個cell之前,會先發送訊息給delegate並呼叫tableView(_:willDisplay:forRowAt:),給delegate一個機會去覆寫tableView先前設定的屬性,像是背景顏色。
首先我們給這個function一個更換背景顏色的設定:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if newTableView.backgroundColor == UIColor.white {
newTableView.backgroundColor = UIColor.black
} else if newTableView.backgroundColor == UIColor.black {
newTableView.backgroundColor = UIColor.white
}
}
接下來實作一個button,每次按下的時候都會reload data,也就是重新生成cell:
@objc func reloadAction(_ sender: UIButton) {
newTableView.reloadData()
}
如此一來就會呈現我們想要的效果。
當然並不一定要改變背景顏色,你也可以設計很多其他的action,讓他在表格生成新的cell之前觸發。
而tableView(_:shouldSpringLoadRowAt:with:)定義了table開放使用spring-loading的權限,true為允許,預設是false。
tableView(:didSelectRowAt:)和tableView(:didDeselectRowAt:)決定了當row被選取或是取消選取時會發生的action。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
data[indexPath.row] = "\(data[indexPath.row])0"
tableView.reloadRows(at: [indexPath], with: .automatic)
}
範例中我們讓表格被點擊後會修改data陣列於當前索引值的資料(加0)。並重新加載此列以顯示變更後的資料。
但如果table是處在isEditing的狀態(先前移動row的範例裡有提到),則點擊row時此方法也不會被呼叫。
而tableView(:willSelectRowAt:)跟tableView(:willDeselectRowAt:)完全相反,就是一個你要選我我偏不要的概念。
他在row將被選取或取消選取的時候被呼叫,回傳一個optional IndexPath去確認或更改你選取的row...what!?
也就是我選A就變B,選B就變C,根本整人遊戲。如果你想讓你的row失去效用,也可以回傳nil,這樣不管你在tableView(_:didSelectRowAt:)寫了多少東西,系統94不會幫你執行,超壞。
不知道大家有沒有印象,在相簿選擇圖片的時可以用2隻手指頭滑動多重選取?這是蘋果提供給使用者的原生操作方式。
(圖片來源:Selecting Multiple Items with a Two-Finger Pan Gesture)
而table也支援這個操作模式,只需要讓
tableView(:shouldBeginMultipleSelectionInteractionAt:)這個function回傳true,便可以使用這個功能。
而在使用者使用該功能的當下,table便會回傳一個訊息給delegate,並呼叫tableView(:didBeginMultipleSelectionInteractionAt:)。你可以在這個function裡定義當使用者多重選取時,相對應的indexPath要回饋的動作。
那今天就先講到這裡...
下一回來講講table view的appearance吧QQ