iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
1
自我挑戰組

Hey! UIKit, 做個朋友吧~系列 第 19

Day 19: 來自深淵-UITableView(IV)

看到右邊這個scroll bar的大小,就知道我沒把UITableViewDelegate全部demo完。
我自首,delegate裡面的東西真的好多,我看的好累啊QQ


一般tableViewDelegate所管理的內容如下:

  • 建立及管理客製化的header/footer。
  • 指定row/header/footer的高度。
  • 提供cell的估計高度,讓table在滾動時能更有效計算在佇列裡的reusable cell重新生成的位置。
  • Indent row content.(待理解)
  • 回應列的選取。
  • 回應列的其他動作,例如左滑右滑。
  • 支援編輯表格內容。

Configuring Rows

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。

Responding Rows

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


上一篇
Day 18: 來自深淵-UITableView(III)
下一篇
Day 20: 來自深淵-UITableView(V)
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言