讀了官方的這篇文章 Inserting and Deleting Rows and Sections 寫一個筆記
------
Table View 的編輯模式如下圖所示,左邊的按鈕是editing control, 右邊的recording control
通常是用戶點擊 eding control 之后碧囊,Table View才會進入編輯模式失暴,執(zhí)行插入或者刪除峭沦,但這并不是絕對。也就是說,沒有進入編輯模式,也可以執(zhí)行插入或者編輯操作厚棵。
1. 編輯模式下的插入刪除
Table View 在接收到 setEditing:animated:
函數(shù)的信息之后進入編輯模式
通常,這個函數(shù)都是由用戶點擊導航欄上的編輯按鈕(一般都是這么設(shè)計擺放這個按鈕的)所觸發(fā)蔼紧。
在編輯模式下婆硬,每行都由 delegate 分配給左邊 editing control 和右邊 recording control
注意??: 如果是UIViewController 管理的Table View,它會在編輯按鈕被點擊的時候自動接收到
setEditing:animated:
函數(shù)的信息奸例,并在Table View 的相應函數(shù)被調(diào)用之前彬犯,就更新按鈕狀態(tài)或者響應其它任務(wù)。
在Table View 接收到信息之后查吊,它會給每個可視行的 UITableViewCell 對象發(fā)送同樣的信息谐区,然后發(fā)送一連串的信息給 data source 和 Delegate
在再次發(fā)送消息給對應可是行的單元格時,消息序列如下所示:
- Table View 調(diào)用
tableView:canEditRowAtIndexPath:
方法(如果這個方法有在datasource中實現(xiàn)的話)逻卖。 這個方法決定了Table View對應的單元能不能被編輯宋列,優(yōu)先級高于editingStyle
屬性,也就是說评也,無論cell’s editingStyle prop
設(shè)置的是什么炼杖,都是以有實現(xiàn)的這個方法為準灭返。 - Table View
tableView:editingStyleForRowAtIndexPath:
方法(如果這個方法有在delegate中實現(xiàn)的話)。這個方法決定了editing control樣式和功能嘹叫。這時婆殿,Table View 已經(jīng)完全進入編輯模式。 顯示了每一個被允許編輯行的插入刪除模式罩扇。 - 用戶點擊editing control (插入或者刪除按鈕婆芦,開篇圖片中的左半部分)。這一步也就是點擊刪除按鈕時發(fā)送的確認消息喂饥。也就是通常出現(xiàn)在右半部分那個按鈕消约。
- Table view 發(fā)送
tableView:commitEditingStyle:forRowAtIndexPath:
消息給 data source。 雖然這個方法在data source中是可選的员帮,但是如果要進行插入刪除操作的話一定要實現(xiàn)或粮。這個方法做兩家事情:
- 發(fā)送
deleteRowsAtIndexPaths:withRowAnimation:
或者insertRowsAtIndexPaths:withRowAnimation:
指示Table view 刷新顯示 。 - 通過增刪數(shù)據(jù)模型數(shù)組同步更新數(shù)據(jù)模型捞高。
當用戶通過滑動來刪除的時候氯材,調(diào)用順序是跟上述有些許不同的。當用戶滑動的時候硝岗,Table View首先檢測tableView:commitEditingStyle:forRowAtIndexPath:
是否有實現(xiàn)氢哮。如果實現(xiàn)了,Table View將發(fā)送setEditing:animated:
給自己然后進入編輯模式型檀。在這個“滑動刪除”模式中冗尤,Table View不會顯示editing control和 reordering control。因為這是一個用戶驅(qū)動事件胀溺,并且將消息包在tableView:willBeginEditingRowAtIndexPath:
和tableView:didEndEditingRowAtIndexPath:
中裂七。通過實現(xiàn)這兩個方法,delegate將會正確顯示Table View 仓坞。
注意??: _Data source _不應該從
tableView:commitEditingStyle:forRowAtIndexPath:
的實現(xiàn)(OC中@implementation
)部分的內(nèi)部調(diào)用setEditing:animated:
背零。如果出于某種原因必須這么做的話,需要用performSelector:withObject:afterDelay:
函數(shù)設(shè)置延遲調(diào)用扯躺。
雖然可以使用insertion control 作為觸發(fā)器來插入新的行捉兴,但是另外可供選擇的方法是在導航欄上添加一個“添加”按鈕。點擊按鈕發(fā)送action
信息給view controller
,然后用一個modal view
覆蓋table view
來填寫新項的具體內(nèi)容录语,再把數(shù)據(jù)添加到數(shù)據(jù)模型數(shù)組中倍啥,最后調(diào)用tableView.reload()
刷新table view
。