UITableView編輯模式詳解

轉(zhuǎn)載:UITableView 編輯模式詳解
作者:秋刀生魚片

UITableView的相關(guān)編輯操作非常全,今天我們來做一個總結(jié)蕾殴。跟編輯相關(guān)的屬性和接口有如下笑撞,我們一個一個分析,我們先認(rèn)真閱讀一下相關(guān)頭文件钓觉,我根據(jù)意思大概翻譯了一下注釋茴肥。

1、屬性方法

@property (nonatomic, getter=isEditing) BOOL editing;                             

// 默認(rèn)狀態(tài)是非編輯狀態(tài)荡灾,如果不調(diào)用下面接口直接設(shè)置瓤狐,是沒有動畫的
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

2、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;

3绸罗、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是否需要縮進(jìn)。
- (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;

4、編輯狀態(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 多選模式儡毕,左邊是藍(lán)色對號

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

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

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

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

上面這個回調(diào)中附井,根據(jù)editingStyle進(jìn)行判斷讨越,處理對應(yīng)的UI和數(shù)據(jù)。

5羡忘、8.0版本后的多選側(cè)滑菜單

8.0版本后谎痢,短信等原生應(yīng)用都有了側(cè)滑多按鈕選擇,原來是蘋果的前端團(tuán)隊為TableView加入相關(guān)接口卷雕,這里給個例子

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return @[
             [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:NSLocalizedString(@"編輯", nil) handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
               
             }],
             [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:NSLocalizedString(@"刪除", nil) handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
               
             }]
             ];
}

6节猿、數(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寫不好了雪侥,下一篇文章我準(zhǔn)備詳細(xì)講一講這個有趣的類碗殷。

7、其他補充

編輯模式下速缨,不讓cell縮進(jìn)锌妻,要怎么做呢?

cell.shouldIndentWhileEditing = NO;

或者

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

那一個有效呢旬牲?

注意官方注釋

// Controls whether the background is indented while editing.  If not implemented, the default is YES.  This is unrelated to the indentation level below.  This method only applies to grouped style table views.

只對grouped的TableView有效从祝。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市引谜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌擎浴,老刑警劉巖员咽,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贮预,居然都是意外死亡贝室,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門仿吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滑频,“玉大人,你說我怎么就攤上這事唤冈∠棵裕” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵你虹,是天一觀的道長绘搞。 經(jīng)常有香客問我,道長傅物,這世上最難降的妖魔是什么夯辖? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮董饰,結(jié)果婚禮上蒿褂,老公的妹妹穿的比我還像新娘圆米。我一直安慰自己,他們只是感情好啄栓,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布娄帖。 她就那樣靜靜地躺著,像睡著了一般谴供。 火紅的嫁衣襯著肌膚如雪块茁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天桂肌,我揣著相機(jī)與錄音数焊,去河邊找鬼。 笑死崎场,一個胖子當(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
  • 我被黑心中介騙來泰國打工若河, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人寞宫。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓萧福,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辈赋。 傳聞我的和親對象是個殘疾皇子鲫忍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

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

  • UITableView 編輯模式詳解 UITableView的相關(guān)編輯操作非常全,今天我們來做一個總結(jié)钥屈。跟編輯相關(guān)...
    秋刀生魚片閱讀 30,844評論 30 56
  • 1悟民、tableView 的編輯模式 進(jìn)入編輯模式 代碼體現(xiàn) // 設(shè)置 editing 屬性tableView?....
    早起的蟲兒子被鳥吃閱讀 6,103評論 0 4
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子篷就,類似...
    liudhkk閱讀 9,035評論 3 38
  • #pragma mark someValueAboutTableView 1.tableView的樣式:UITab...
    瀟巖閱讀 905評論 0 0
  • 這是自我感覺拍的最好看的一張郁金香了 不知道是什么品種的 這個花叫啥名字啊逾雄,我旁邊朋友說是雜草說它因為沒有圍起來,...
    安澤記事本閱讀 307評論 0 0