UITableView的代理方法,實(shí)現(xiàn)編輯导狡、刪除约巷、排序、多選

UITableView除了常規(guī)的選擇模式(selection mode)外還有一個(gè)編輯模式(editing mode),在編輯模式中可實(shí)現(xiàn)刪除旱捧,插入独郎,多選,重排序等枚赡。

一.進(jìn)入編輯模式

通過直接設(shè)置UITableView的editing屬性或向其發(fā)送setEditing:animated:消息氓癌,可將其置于編輯模式。

self.tableview.editing = YES; [self.tableview setEditing:YES animated:YES];

UIViewController本身也有editing屬性和setEditing:animated:方法贫橙,在當(dāng)前視圖控制器由導(dǎo)航控制器控制且導(dǎo)航欄中包含editButtonItem時(shí)贪婉,若UIViewController的editing為NO,則顯示為”Edit”,若editing為YES,則顯示為”Done”料皇。

可利用此按鈕在設(shè)置UIViewController的editing狀態(tài)時(shí)同時(shí)設(shè)置tableView的編輯狀態(tài)谓松。

- (void)viewDidLoad {? ? [super viewDidLoad];? ? ....

self.navigationItem.rightBarButtonItem = self.editButtonItem; }

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {? ? [super

setEditing:editing animated:animated];? ? [self.tableView

setEditing:editing animated:animated]; }

也可自定義其他按鈕,將其響應(yīng)設(shè)為修改tableView進(jìn)入編輯模式。

- (void)editAction:(id)sender {? ? [self.tableView setEditing:YES animated:YES]; }

UITableView接收到setEditing:animated:消息時(shí)践剂,會(huì)發(fā)送同樣的消息到所有可見的cell,設(shè)置其編輯模式娜膘。

二.插入和刪除

進(jìn)入編輯模式后逊脯,UITableView向其DataSource發(fā)送tableView:canEditRowAtIndexPath:消息詢問每個(gè)indexPath是否可編輯,在此方法中對不可以編輯的cell返回NO,可以編輯的cell返回YES,若全部可編輯竣贪,可不實(shí)現(xiàn),大部分應(yīng)用不實(shí)現(xiàn)此方法军洼。

-(BOOL)tableView:(UITableView *)tableView

canEditRowAtIndexPath:(NSIndexPath *)indexPath {? ? if (indexPath.row

== 1) {? ? ? ? return NO;? ? }? ? return YES; }

然后巩螃,UITableView 向其delegate發(fā)送tableView:editingStyleForRowAtIndexPath:消息詢問EditingStyle,這里返回刪除(UITableViewCellEditingStyleDelete)或者插入(UITableViewCellEditingStyleInsert);若不實(shí)現(xiàn)此方法匕争,則默認(rèn)為刪除模式避乏,即UITableViewCellEditingStyleDelete。

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {? ? return UITableViewCellEditingStyleDelete;? ? //return UITableViewCellEditingStyleInsert; }

當(dāng)返回的是UITableViewCellEditingStyleDelete時(shí)甘桑,所有可編輯的Cell左側(cè)都會(huì)顯示紅色的”減號”標(biāo)示;

點(diǎn)擊左邊的“減號”,減號會(huì)旋轉(zhuǎn)90度變豎形拍皮,并且cell右側(cè)出現(xiàn)”Delete”按鈕。

當(dāng)返回的是UITableViewCellEditingStyleInsert時(shí)跑杭,在cell的左邊會(huì)顯示綠色”加號”按鈕铆帽。

當(dāng)點(diǎn)擊”Delete”按鈕或者”加號”按鈕時(shí),UITableView向其DataSource發(fā)送tableView:commitEditingStyle:forRowAtIndexPath:消息德谅,根據(jù)傳遞editingStyle來執(zhí)行實(shí)際的刪除或插入操作爹橱,其流程是先修改tableView的數(shù)據(jù)模型,向其中刪除或插入對應(yīng)數(shù)據(jù)項(xiàng),然后再調(diào)整tableView的顯示,刪除或插入對應(yīng)的cell窄做。

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {? ? if (editingStyle == UITableViewCellEditingStyleDelete)

{? ? ? ? [dataArray removeObjectAtIndex:indexPath.row];

[tableview deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]

withRowAnimation:UITableViewRowAnimationFade];? ? }else if(editingStyle == UITableViewCellEditingStyleInsert)

{? ? ? ? [dataArray insertObject:@"new Item"

atIndex:indexPath.row];? ? ? ? [tableview

insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]

withRowAnimation:UITableViewRowAnimationFade];? ? } }

當(dāng)要?jiǎng)h除或插入section時(shí)愧驱,需調(diào)用deleteSections:withRowAnimation:insertSections:withRowAnimation:方法。

插入刪除流程的方法調(diào)用時(shí)序如圖:

三.重排序

若當(dāng)前tableView允許重排序椭盏,則會(huì)在每個(gè)cell的右側(cè)出現(xiàn)三條灰色橫線的控件组砚,拖動(dòng)此空間可將cell移動(dòng)到不同的位置。重排序模式和刪除/插入是并行的庸汗,即可在顯示重排序空間的同時(shí)顯示刪除或插入控件惫确。

當(dāng)tableView的dataSource實(shí)現(xiàn)tableView:moveRowAtIndexPath:toIndexPath:方法后,tableView進(jìn)入編輯模式后就會(huì)在右側(cè)顯示“重排序”控件,如圖所示蚯舱。

其消息處理流程為:

tableView收到setEditing:animated:消息并將同樣的消息發(fā)送給可見的cell改化。

tableView向其DataSource發(fā)送tableView:canMoveRowAtIndexPath:消息,詢問每一行是否可顯示重排序空間枉昏,若為NO,則不顯示陈肛,若為YES則顯示。此方法不實(shí)現(xiàn)時(shí)默認(rèn)所有行都可顯示重排序控件兄裂。這時(shí)就會(huì)在每一行的右側(cè)顯示重排序控件句旱。

因?yàn)橹嘏判驔]有使用向delegate發(fā)送tableView:editingStyleForRowAtIndexPath:消息詢問編輯模式,所以其 與刪除晰奖、插入控件可同時(shí)存在谈撒,在一般情況下不應(yīng)該同時(shí)出現(xiàn),所以應(yīng)實(shí)現(xiàn)了 tableView:editingStyleForRowAtIndexPath:并返回 UITableViewCellEditingStyleNone匾南;若不實(shí)現(xiàn) tableView:editingStyleForRowAtIndexPath:則會(huì)默認(rèn)使用刪除模式啃匿,即右側(cè)出現(xiàn)“排序”控件時(shí),左側(cè)會(huì)出現(xiàn)”刪 除”控件。

用戶可拖動(dòng)每行右側(cè)的空間來移動(dòng)該行的位置溯乒。

用戶拖動(dòng)某行經(jīng)過目標(biāo)行上方時(shí)夹厌,tableView會(huì)向delegate發(fā)送tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:(若delegate有實(shí)現(xiàn))消息詢問是否可移動(dòng)到此位置(ProposedIndexPath),若不可移動(dòng)到此位置則返回一個(gè)新的目的indexPath,可以的話直接將ProposedIndexPath返回即可裆悄。一般情況下不需實(shí)現(xiàn)此方法矛纹。

-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {? ? if (proposedDestinationIndexPath.row == 5) {? ? ? ? return [NSIndexPath indexPathForRow:8 inSection:0];? ? ? }? ? return proposedDestinationIndexPath; }

tableView向其DataSource發(fā)送tableView:moveRowAtIndexPath:toIndexPath:消息,在此方法中更改tableView的數(shù)據(jù)模型,移動(dòng)里面數(shù)據(jù)項(xiàng)的位置光稼。

- (void)tableView:(UITableView *)tableView

moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath

toIndexPath:(NSIndexPath *)destinationIndexPath{? ? if(sourceIndexPath

== destinationIndexPath)? ? ? ? return;? ? id object = [dataArray

objectAtIndex:sourceIndexPath.row];? ? [dataArray

removeObjectAtIndex:sourceIndexPath.row];? ? ? [dataArray

insertObject:object atIndex:destinationIndexPath.row]; }

總體消息流程為:

四.Swipe to Delete

當(dāng)用戶在tableView的一行上滑動(dòng)時(shí)或南,會(huì)在右側(cè)直接出現(xiàn)刪除按鈕,點(diǎn)擊刪除按鈕可刪除此行钟哥。啟用Swipe to Delete模式的條件時(shí)tableView的DataSource實(shí)現(xiàn)了tableView:commitEditingStyle:forRowAtIndexPath:方法迎献;在iOS5中還要保證tableView的allowsMultipleSelectionDuringEditing屬性不為YES(見后面解釋)。

滿足上述條件后腻贰,當(dāng)用戶在tableView的行上滑動(dòng)時(shí)吁恍,tableView會(huì)向自身發(fā)送setEditing:animated:消息進(jìn)入編 輯模式,同時(shí)向可見的cell發(fā)送setEditing:animated:消息播演,在當(dāng)前滑動(dòng)的行右側(cè)會(huì)出現(xiàn)紅色”Delete”按鈕冀瓦。

同樣在點(diǎn)擊”Delete”按鈕時(shí)會(huì)向tableView的DataSource發(fā)送tableView:commitEditingStyle:forRowAtIndexPath:消息,執(zhí)行實(shí)際的刪除操作。

“Delete”按鈕上顯示的文字可以更改写烤,包括普通刪除模式下的”Delete”按鈕翼闽。若要顯示不同的內(nèi)容,可在tableView Delegate中實(shí)現(xiàn)tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:方法洲炊,返回”Delete”按鈕中需要顯示的內(nèi)容

tableView在向自身發(fā)送setEditing:animated:消息的前后感局,會(huì)向其delegate分別發(fā)送tableView:willBeginEditingRowAtIndexPath:,tableView:didEndEditingRowAtIndexPath:消息。在這些方法中可相應(yīng)更新tableView的顯示暂衡。How does the Twitter iPhone app implement side swiping on a table?中通過實(shí)現(xiàn)tableView:willBeginEditingRowAtIndexPath:方法使得用戶在tableView的行上swipe時(shí)可滑出菜單询微。

五.多行選取模式

在iphone自帶的郵件程序中,點(diǎn)擊編輯按鈕后會(huì)出現(xiàn)使用”紅勾”多選的效果狂巢,如圖所示

有幾種方法可以實(shí)現(xiàn)這種效果

1.蘋果公共API

在iOS5.0中UITableView增加了allowsMultipleSelectionDuringEditing屬性和indexPathsForSelectedRows方 法撑毛,allowsMultipleSelectionDuringEditing屬性默認(rèn)為NO,當(dāng)此值為YES時(shí),UITableView進(jìn)入編輯模式 不會(huì)向dataSource查詢editStyle,而會(huì)直接每個(gè)Cell的左邊顯示圓形選擇框唧领,點(diǎn)擊選擇該行后圓形框里面為對勾藻雌。可使用 indexPathsForSelectedRows方法獲取到所有選擇行的indexPath斩个。

蘋果公司提供了使用此種方式的實(shí)例代碼:TableMultiSelect

注:當(dāng)allowsMultipleSelectionDuringEditing屬性為YES時(shí)胯杭,不管當(dāng)前在不在編輯模式內(nèi),swipe to delete都不起作用,若要同時(shí)使用swipe to delete,需在完成選擇任務(wù)后受啥,將tableView的allowsMultipleSelectionDuringEditing恢復(fù)為NO歉摧。另 外,多選”控件可與”重排序”控件同時(shí)出現(xiàn)腔呜。

2.蘋果私用API

在iOS5之前叁温,蘋果并沒有提供多行選取的API,但其內(nèi)部確實(shí)實(shí)現(xiàn)了,我們可以通過使用私有API實(shí)現(xiàn)核畴。

tableView:editingStyleForRowAtIndexPath:方 法中若返回的是 UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert則可以進(jìn)入 多選模式膝但,效果同allowsMultipleSelectionDuringEditing設(shè)為YES時(shí)相同。這也是“多選”控件不會(huì)與“插入”控 件,”刪除”控件同時(shí)出現(xiàn)谤草,卻可以和”重排序”控件同時(shí)存在的原因跟束。

獲取到選擇的行時(shí),同樣可以使用私有方法indexPathsForSelectedRows獲取丑孩,或者使用公開的tableView:didSelectRowAtIndexPath:,tableView:didDeselectRowAtIndexPath:方法在選擇/取消選擇時(shí)逐個(gè)獲取并保存冀宴。

注:以上兩種方式均需保證UITableViewCellselectionStyle屬性不為UITableViewCellSelectionStyleNone,否則選擇后的“紅勾”無法顯示。

3.完全定制方法

一些文章中介紹了不使用tableView本身的方法而完全自己定制實(shí)現(xiàn)多選效果的方法温学。

如:Table View Multi-Row Edit Mode

Multiple row selection and editing in a UITableView

參考:

Table View Programming Guide for iOS – Inserting and Deleting Rows and Sections

Table View Programming Guide for iOS – Managing the Reordering of Rows

UITableView Class Reference

UITableViewDelegate Protocol Reference

UITableViewDataSource Protocol Reference

UITableViewCell Class Reference

How does the Twitter iPhone app implement side swiping on a table?

UITableView劃動(dòng)刪除的實(shí)現(xiàn)

UITableView多選刪除,類似mail中的多選刪除效果

iPhone開發(fā)技巧之私有API(2)— UITableView

iOS 5 Dev Warning: UITableView’s Multiple Select During Editing Doesn’t Work with Swipe to Delete

Table View Multi-Row Edit Mode

Multiple row selection and editing in a UITableView

http://linglong117.blog.163.com/blog/static/277145472012103075527791/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末略贮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仗岖,更是在濱河造成了極大的恐慌逃延,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧拄,死亡現(xiàn)場離奇詭異揽祥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)檩电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門拄丰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俐末,你說我怎么就攤上這事料按。” “怎么了鹅搪?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵站绪,是天一觀的道長。 經(jīng)常有香客問我丽柿,道長恢准,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任甫题,我火速辦了婚禮馁筐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坠非。我一直安慰自己敏沉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盟迟,像睡著了一般秋泳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攒菠,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天迫皱,我揣著相機(jī)與錄音,去河邊找鬼辖众。 笑死卓起,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹炸。 我是一名探鬼主播戏阅,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼啤它!你這毒婦竟也來了奕筐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蚕键,失蹤者是張志新(化名)和其女友劉穎救欧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锣光,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笆怠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了誊爹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蹬刷。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖频丘,靈堂內(nèi)的尸體忽然破棺而出办成,到底是詐尸還是另有隱情,我是刑警寧澤搂漠,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布迂卢,位于F島的核電站,受9級特大地震影響桐汤,放射性物質(zhì)發(fā)生泄漏而克。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一怔毛、第九天 我趴在偏房一處隱蔽的房頂上張望员萍。 院中可真熱鬧,春花似錦拣度、人聲如沸碎绎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筋帖。三九已至奸晴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幕随,已是汗流浹背蚁滋。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赘淮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓睦霎,卻偏偏與公主長得像梢卸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子副女,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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