終於要爬出深淵啦~~今天是值得慶祝的UITableView的完結篇
scrollToRow(at:at:animated:)可以讓指定indexPath的row移動到表格上指定的position,UITableView.ScrollPosition是個enum,有上中下等位置。
例如我對scrollButton加入以下action,設定indexPath及捲動的最終位置:
@objc func scrollAction(_ sender: UIButton) {
newTableView.scrollToRow(at: IndexPath(row: 7, section: 1), at: UITableView.ScrollPosition.middle, animated: true)
}
則當我按下button時,section 1的row 7就跑到表格的最中間了。
呼叫此方法不同於使用者捲動畫面,並不會傳送訊息給UIScrollViewDelegate跟呼叫scrollViewDidScroll(_:)。
而scrollToNearestSelectedRow(at:animated:)顧名思義,就是把被選取的row捲到指定的table view位置:
@objc func scrollAction(_ sender: UIButton) {
newTableView.scrollToNearestSelectedRow(at: UITableView.ScrollPosition.middle, animated: true)
}
其實之前為了講move跟allowSelection時就有提到過edit mode,使用setEditing(_:animated:)或isEditing指定一個布林值來切換表格進入(true)/退出(false)編輯模式。
一般狀況下,進入編輯模式會於表格列的左側出現插入/刪除符號,而右側出現重新安排表格列(例如移動)的符號(下圖左)。而如果表格允許多重選取(allowsMultipleSelectionDuringEditing的值為true),則進入編輯模式後表格列左側會出現多重選取的checkmark(下圖右)。
這是一串取得所指定section/row/header/footer在table view的位置及大小(CGRect)的function。
取得section,若tableView.style為plain,則section = 0。
newTableView.rect(forSection: 1)
取得row,若indexPath無效,則返回CGRectZero。
newTableView.rectForRow(at: IndexPath(row: 7, section: 1))
取得header/footer。
newTableView.rectForHeader(inSection: 2)
newTableView.rectForFooter(inSection: 3)
remembersLastFocusedIndexPath是個布林值,當值為true的時候,會在視圖控制器轉換時記憶在table離開focus前最後被focus的cell的indexPath,並且在table重新被focus時自動重新導向到記憶的indexPath。預設值為false。
在view controller轉換的期間或當下,這個屬性的影響可能被忽略。在這種情況下,view controller會在此屬性影響前試圖讀取在轉換前被focus的對象。
有沒有印象,有時facebook或其他應用程式使用到一半移到背景程式或休眠(非關閉),但過不久再打開程式就重啟了。
這是因為app沒有設定狀態存取。tableView支援app內部對狀態進行存取,要使用這個功能,你需要為restorationIdentifier設置一個非空字串。當tableView的父視圖被儲存後,tableView裡的內容也會自動被儲存。
如果tableView dataSource採用UIDataSourceModelAssociation這個協定,table將藉由一個你自定義的ID來存取資料而非indexPath。
而你重新focus該應用程式時,app就會依據設定的restorationIdentifier,從休眠前的最終狀態開始讀取而不會重新讀取整個程式。
那下一回即將進入UITextView。