標籤:
先說兩個方法beginUpdates和endUpdates,幾點注意事項:
- 一般我們把行、塊的插入、刪除、移動寫在由這兩個方法組成的函數塊中。如果你不是在這兩個函數組成的塊中調用插入、刪除、移動方法,表的屬性(比如行數)可能失效。
- 一般也不應該在由這兩個函數組成的函數塊中調用reloadData,如果你這麼做了,那麼所有的動畫都要自己進行。
- 這兩個方法組成的塊,可以嵌套。
- 同一個塊中的插入、刪除操作,先處理完刪除操作才會執行插入操作,而不管在它們在塊中的順序。
UITableView是否處於編輯模式取決於它的editing屬性。當處於編輯模式時,在每一個cell的左側會顯示一個插入或刪除的控制項,具體顯示什麼取決於cell是怎麼配置的。觸摸一個控制項的時候會讓tableView調用資料來源方法tableView:commitEditingStyle:forRowAtIndexPath:。可以調用setEditing:animated:讓tableView進入或者退出編輯模,表的資料來源可以有選擇的拒絕cell進入編輯模式,通過實現tableView:canEditRowAtIndexPath:。
當一個tableView處於編輯狀態時,它的代理通過 tableView:editingStyleForRowAtIndexPath:返回每個可編輯的cell所處的狀態(插入、刪除)。當一個tableView收到setEditing:animated:訊息時,它給每個每一個可見行的UITableViewCell對象發送相同的訊息,接著它給資料來源和代理髮送一連串訊息像下面圖中描述的那樣。
當使用者swipe across一行顯示delete按鈕,在上面圖中的調用順序有一個變化。當使用者swipe一行要刪除的時候,tableView首先檢查它的資料來源是否實現了tableView:commitEditingStyle:forRowAtIndexPath:方法,如果實現了,tableView給自己發送setEditing:animated:訊息,進入編輯模式。在這個“swipe to delete”模式,tableView不顯示編輯和重新排序控制項。因為這是一個使用者驅動事件,it also brackets the messages to the delegate inside of two other messages:tableView:willBeginEditingRowAtIndexPath: and tableView:didEndEditingRowAtIndexPath:.(怎麼翻譯合適^.^)。通過實現這些方法,代理可以合適的更新tableView的外觀。
【後邊有點複雜,我先研究研究】
UITableView的編輯(插入、刪除、移動)