Reload TableView 刷新tableview畫面(reloadData & updates)

(Tableview, reloadData, reloadSection, reloadRow, beginUpdates, endUpdates)

在繪製畫面時,會需要滑動的處理或是彈性化的繪製畫面
透過tableview呈現可以輕鬆做到

但是如果畫面的資料較複雜,例如:按鈕切換子分頁
會需要更新畫面

可以參考本文的介紹,依照需求去更新

reloadData()

官方文件:

reloadData 會更新TableView所有數據,包含其 cell、section header、section footer 以及其 index arrays 等等。
為了提高效率,TableView只重新顯示當下的欄位,但如果cell欄位更新後縮小,cell也會更新畫面,縮小欄位高度。

reloadData後TableView的delegate跟data source也重新執行,因此需要消耗較多的效能,因此較適合應用於畫面初始化後,api取得資料後的更動畫面使用。

可以應用於資料更新時(數量)刷新畫面,但如果只是想要更新某部分的資訊,可以考慮其他的更新方式。

如果刪除或新增row,可以使用reloadRow或是reloadSection刷新畫面
(待下方介紹)
如果單純調整畫面(高度或畫面更新),欄位順序皆不變,可以使用beginUpdates() 跟endUpdates()(待下方介紹)

使用方式:

reloadSection()

官方文件:

reloadSection 會更新TableView中指定的Section所有數據,根據data source定義Section的設定,做Section畫面的更新,同時可以帶動畫提示用戶更改

如果畫面有伸展縮起的應用,很適合使用reloadSection刷新畫面,避免刷新重載時用過多的效能,也可能造成使用者體驗不佳。

使用方式:

IndexSet中integer指定刷新的secion
with:動畫方式(如下圖選項),不要動畫定義none

reloadRow()

官方文件:

reloadRow 會更新TableView中指定的Row所有數據,根據data source定義Row的設定,做Row畫面的更新,同時可以帶動畫提示用戶更改

如果只需要更新某行的cell畫面,例如按按鈕後或更換文字樣式等,很適合使用reloadRow刷新畫面,避免刷新重載時用過多的效能,也可能造成使用者體驗不佳。

使用方式:

IndexPath中定義要更新的row位置,設定在哪個section跟row
with:動畫方式(如下圖選項),不要動畫定義none

beginUpdates() . endUpdates()

beginUpdates文件

beginUpdates可以應用於後續的插入、刪除和選擇操作(例如 cellForRow(at:) 和 indexPathsForVisibleRows)同時進行動畫處理

不需要reloadRow重新載入Cell內容,透過beginUpdates且必須接著使用 endUpdates() 方法來改變cell高的動畫。

且不應該在beginUpdates&endUpdates中使用reloadData如果同時使用reloadData,必須要額外自己寫其他的動畫。

endUpdates文件

透過endUpdates來做beginUpdates開頭動作的結尾,中間可能操作插入、刪除和選擇操作(例如 cellForRow(at:) 和 indexPathsForVisibleRows)時的動畫。

使用方式:

效果會像這樣,畫面更新時由上往下刷的動作

如果要取消動畫,可以參考下方做法

或是

畫面更新後不會有動畫

--

--