讀了官方的這篇文章 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ù)都是由用戶點擊導(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 source 和 Delegate

在再次發(fā)送消息給對應(yīng)可是行的單元格時,消息序列如下所示:
- 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)。 - 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ù)模型。
當(dāng)用戶通過滑動來刪除的時候,調(diào)用順序是跟上述有些許不同的。當(dāng)用戶滑動的時候,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 _不應(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。