UITableView 編輯模式

讀了官方的這篇文章 Inserting and Deleting Rows and Sections 寫一個筆記

------

Table View 的編輯模式如下圖所示,左邊的按鈕是editing control, 右邊的recording control

TableView編輯模式

通常是用戶點擊 eding control 之后,Table View才會進入編輯模式,執(zhí)行插入或者刪除,但這并不是絕對。也就是說,沒有進入編輯模式,也可以執(zhí)行插入或者編輯操作。

1. 編輯模式下的插入刪除

Table View 在接收到 setEditing:animated: 函數(shù)的信息之后進入編輯模式
通常,這個函數(shù)都是由用戶點擊導(dǎo)航欄上的編輯按鈕(一般都是這么設(shè)計擺放這個按鈕的)所觸發(fā)。
在編輯模式下,每行都由 delegate 分配給左邊 editing control 和右邊 recording control

注意??: 如果是UIViewController 管理的Table View,它會在編輯按鈕被點擊的時候自動接收到 setEditing:animated: 函數(shù)的信息,并在Table View 的相應(yīng)函數(shù)被調(diào)用之前,就更新按鈕狀態(tài)或者響應(yīng)其它任務(wù)。

在Table View 接收到信息之后,它會給每個可視行的 UITableViewCell 對象發(fā)送同樣的信息,然后發(fā)送一連串的信息給 data sourceDelegate

Table View插入刪除消息發(fā)送順序

在再次發(fā)送消息給對應(yīng)可是行的單元格時,消息序列如下所示:

  1. Table View 調(diào)用tableView:canEditRowAtIndexPath: 方法(如果這個方法有在datasource中實現(xiàn)的話)。 這個方法決定了Table View對應(yīng)的單元能不能被編輯,優(yōu)先級高于editingStyle屬性,也就是說,無論cell’s editingStyle prop設(shè)置的是什么,都是以有實現(xiàn)的這個方法為準(zhǔn)。
  2. Table View tableView:editingStyleForRowAtIndexPath:方法(如果這個方法有在delegate中實現(xiàn)的話)。這個方法決定了editing control樣式和功能。這時,Table View 已經(jīng)完全進入編輯模式。 顯示了每一個被允許編輯行的插入刪除模式。
  3. 用戶點擊editing control (插入或者刪除按鈕,開篇圖片中的左半部分)。這一步也就是點擊刪除按鈕時發(fā)送的確認消息。也就是通常出現(xiàn)在右半部分那個按鈕。
  4. Table view 發(fā)送 tableView:commitEditingStyle:forRowAtIndexPath:消息給 data source。 雖然這個方法在data source中是可選的,但是如果要進行插入刪除操作的話一定要實現(xiàn)。這個方法做兩家事情:
  • 發(fā)送 deleteRowsAtIndexPaths:withRowAnimation: 或者 insertRowsAtIndexPaths:withRowAnimation: 指示Table view 刷新顯示 。
  • 通過增刪數(shù)據(jù)模型數(shù)組同步更新數(shù)據(jù)模型。

當(dāng)用戶通過滑動來刪除的時候,調(diào)用順序是跟上述有些許不同的。當(dāng)用戶滑動的時候,Table View首先檢測tableView:commitEditingStyle:forRowAtIndexPath:是否有實現(xiàn)。如果實現(xiàn)了,Table View將發(fā)送setEditing:animated:給自己然后進入編輯模式。在這個“滑動刪除”模式中,Table View不會顯示editing controlreordering control。因為這是一個用戶驅(qū)動事件,并且將消息包在tableView:willBeginEditingRowAtIndexPath:tableView:didEndEditingRowAtIndexPath:中。通過實現(xiàn)這兩個方法,delegate將會正確顯示Table View 。

注意??: _Data source _不應(yīng)該從tableView:commitEditingStyle:forRowAtIndexPath:的實現(xiàn)(OC中@implementation)部分的內(nèi)部調(diào)用setEditing:animated:。如果出于某種原因必須這么做的話,需要用performSelector:withObject:afterDelay:函數(shù)設(shè)置延遲調(diào)用。

雖然可以使用insertion control 作為觸發(fā)器來插入新的行,但是另外可供選擇的方法是在導(dǎo)航欄上添加一個“添加”按鈕。點擊按鈕發(fā)送action 信息給view controller,然后用一個modal view覆蓋table view來填寫新項的具體內(nèi)容,再把數(shù)據(jù)添加到數(shù)據(jù)模型數(shù)組中,最后調(diào)用tableView.reload()刷新table view。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容