UITableView 編輯模式詳解

UITableView 編輯模式詳解

UITableView的相關(guān)編輯操作非常全炊豪,今天我們來做一個總結(jié)在跳。跟編輯相關(guān)的屬性和接口有如下,我們一個一個分析伶选,我們先認真閱讀一下相關(guān)頭文件史飞,我根據(jù)意思大概翻譯了一下注釋尖昏。

屬性方法

@property (nonatomic, getter=isEditing) BOOL editing;                             
// 默認狀態(tài)是非編輯狀態(tài),如果不調(diào)用下面接口直接設(shè)置构资,是沒有動畫的
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

DataSource

// 當(dāng)增減按鈕按下時会宪,用來處理數(shù)據(jù)和UI的回調(diào)。
// 8.0版本后加入的UITableViewRowAction不在這個回調(diào)的控制范圍內(nèi)蚯窥,UITableViewRowAction有單獨的回調(diào)Block掸鹅。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

// 這個回調(diào)實現(xiàn)了以后,就會出現(xiàn)更換位置的按鈕拦赠,回調(diào)本身用來處理更換位置后的數(shù)據(jù)交換巍沙。
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

// 這個回調(diào)決定了在當(dāng)前indexPath的Cell是否可以編輯。
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

// 這個回調(diào)決定了在當(dāng)前indexPath的Cell是否可以移動荷鼠。
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

Delegate

// 這個回調(diào)很關(guān)鍵句携,返回Cell的編輯樣式。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;

// 刪除按鈕的文字
- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;

// 8.0后側(cè)滑菜單的新接口允乐,支持多個側(cè)滑按鈕矮嫉。
- (nullable NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

// 這個接口決定編輯狀態(tài)下的Cell是否需要縮進。
- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath;

// 這是兩個狀態(tài)回調(diào)
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath __TVOS_PROHIBITED;

編輯狀態(tài)

UITableView通過editing屬性控制編輯狀態(tài)牍疏,調(diào)用- (void)setEditing:(BOOL)editing animated:(BOOL)animated接口蠢笋,可以決定是否使用原生的變換動畫。

當(dāng)調(diào)用這個接口鳞陨,并將editing設(shè)為YES是昨寞,UITableView將開始詢問代理(Delegate)需要編輯哪些Cell,用什么樣的方式編輯厦滤。

首先調(diào)用回調(diào)方法- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;援岩,這里需要返回YES;

然后依次為各個Cell調(diào)用- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;方法獲取編輯樣式掏导。

typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) {
    UITableViewCellEditingStyleNone,
    UITableViewCellEditingStyleDelete,
    UITableViewCellEditingStyleInsert
};

編輯樣式枚舉有三種享怀,位運算組合則由不同的用途。

UITableViewCellEditingStyleNone 沒有編輯樣式
UITableViewCellEditingStyleDelete 刪除樣式 (左邊是紅色減號)
UITableViewCellEditingStyleInsert 插入樣式  (左邊是綠色加號)
UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert 多選模式趟咆,左邊是藍色對號

特別注意添瓷,右邊的移動并不是這里控制的,需要實現(xiàn)下面這個回調(diào)才會出現(xiàn)忍啸。

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

另外對于新手來說仰坦,要明白這里的回調(diào)都沒有對UI和數(shù)據(jù)進行操作,開發(fā)者需要在回調(diào)中计雌,完成相應(yīng)的操作悄晃。比如刪除或者添加一條數(shù)據(jù),應(yīng)在

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

上面這個回調(diào)中,根據(jù)editingStyle進行判斷妈橄,處理對應(yīng)的UI和數(shù)據(jù)庶近。

數(shù)據(jù)與UI更新

數(shù)據(jù)更新沒什么好說的,直接操作數(shù)據(jù)容器就好眷蚓,無論是數(shù)組鼻种、字典還是CoreData數(shù)據(jù)。UI更新則需要使用TableView的方法沙热,如果需求reloadData無法滿足叉钥,則必須使用下面的方法

- (void)beginUpdates;   // allow multiple insert/delete of rows and sections to be animated simultaneously. Nestable
- (void)endUpdates;     // only call insert/delete/reload calls or change the editing state inside an update block.  otherwise things like row count, etc. may be invalid.

- (void)insertSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection NS_AVAILABLE_IOS(5_0);

- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
- (void)moveRowAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath NS_AVAILABLE_IOS(5_0);

beginUpdatesendUpdates兩個方法,在你需要批量處理Cell的時候篙贸,用來包裹住你的處理代碼投队,其他方法名字都很直觀,不一一介紹了爵川。

最后給大家推薦一個Cocoa框架里的功能強大的類NSFetchedResultsController敷鸦,用于綁定CoreData數(shù)據(jù)和UITableView或者UICollectionView,直接封裝好所有的UI操作代碼寝贡,只要數(shù)據(jù)有變動扒披,UI自動更新,爽的不要不要的圃泡,媽媽再也不用擔(dān)心我的TableView寫不好了碟案,下一篇文章我準備詳細講一講這個有趣的類。

2017.11.29更新

感謝簡單程序媛同學(xué)的發(fā)問洞焙,在此補充一個回調(diào)蟆淀,用于只使用tableView右側(cè)排序功能,而不顯示左側(cè)刪除和插入澡匪,并且左側(cè)不留白的方法

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleNone; 
}

- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

UITableViewCellEditingStyleNone隱藏了左側(cè)編輯按鈕,shouldIndentWhileEditingRowAtIndexPath控制cell在編輯模式下左側(cè)是否縮進褒链。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唁情,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子甫匹,更是在濱河造成了極大的恐慌甸鸟,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兵迅,死亡現(xiàn)場離奇詭異抢韭,居然都是意外死亡,警方通過查閱死者的電腦和手機恍箭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門刻恭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事鳍贾“柏遥” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵骑科,是天一觀的道長橡淑。 經(jīng)常有香客問我,道長咆爽,這世上最難降的妖魔是什么梁棠? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮斗埂,結(jié)果婚禮上掰茶,老公的妹妹穿的比我還像新娘。我一直安慰自己蜜笤,他們只是感情好濒蒋,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著把兔,像睡著了一般沪伙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上县好,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天围橡,我揣著相機與錄音,去河邊找鬼缕贡。 笑死翁授,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾咪。 我是一名探鬼主播收擦,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谍倦!你這毒婦竟也來了塞赂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤昼蛀,失蹤者是張志新(化名)和其女友劉穎宴猾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叼旋,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡仇哆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了夫植。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讹剔。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辟拷,到底是詐尸還是另有隱情撞羽,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布衫冻,位于F島的核電站诀紊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏隅俘。R本人自食惡果不足惜邻奠,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望为居。 院中可真熱鬧碌宴,春花似錦、人聲如沸蒙畴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膳凝。三九已至弹囚,卻和暖如春壶愤,著一層夾襖步出監(jiān)牢的瞬間递鹉,已是汗流浹背库说。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留著淆,地道東北人劫狠。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像永部,于是被迫代替她去往敵國和親独泞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容