實現 UITableViewCell的批量刪除
上一篇文章提到可以非常快捷實現簡單的UITableView的刪除操作,但是有時候無法滿足需求,比如:使用者可以選擇cell來決定哪些cell需要刪除(一起被刪除)。
UITableView有一個屬性allowsMultipleSelectionDuringEditing
,如果這個屬性被設定為YES
,當UITableView進入編輯模式
的時候,UITableView出現的不再是預設的樣式(左面紅色的-按鈕),而是會在左面出現可選擇
的按鈕。
當使用者點選這些按鈕,那麼這行cell就相當於被選中
;如果再點選,則會自動取消選中。
用程式碼來實現上述操作:
- (void)viewDidLoad
{
[super viewDidLoad];
// 設定tableView在編輯模式下可以多選,並且只需設定一次
self.tableView.allowsMultipleSelectionDuringEditing = YES;
}
// 當使用者點選一個按鈕的時候會進入這個方法,這個方法是讓tableView進入編輯模式
- (IBAction)makeSelectable
{
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
}
此時點選按鈕就會進入編輯模式
,在每個cell左面就會出現可選擇
按鈕,點選就可以選中多個cell。
注意如果在
makeSelectable
方法中是這樣實現的:- (IBAction)makeSelectable { [self.tableView setEditing:YES animated:YES]; }
會發現依然會出現
編輯模式
,但是此時編輯模式
是退不出去的。所以要在makeSelectable
方法中將editing
設定為!self.tableView.isEditing
,這樣再次點選這個按鈕,editing
的值就會取反
,這樣可以成功進入和退出。
此時選中了多個cell,但是我們的目的是刪除選中多個cell並進行刪除操作。我們又要去哪裡找到這些選中的cell呢?
不用擔心,UITableView又給我們提供相關屬性啦… Lol
通過UITableView的indexPathsForSelectedRows
,我們可以拿到選中的cell的indexPath,這些indexPath被放到了indexPathsForSelectedRows
這個陣列裡。
此時我們需要另一個按鈕來真正執行多行刪除
操作。並且給這個按鈕繫結一個方法名為removeSelectedCells
。
- (IBAction)removeSelectedCells {
NSMutableArray *deleteBooks = [NSMutableArray array];
for (NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows) {
[deleteBooks addObject:self.books[indexPath.row]];
}
[self.books removeObjectsInArray:deleteBooks];
[self.tableView reloadData];
}
在這個方法中,我們首先遍歷self.tableView.indexPathsForSelectedRows
這個陣列得到各個選中的cell的indexPath,然後在self.books
中根據indexPath來找到對應的book並加入到一個臨時陣列deleteBooks
中。deleteBooks
陣列中表示的就是選中的cell對應的資料模型,然後在self.books
中將這些選中的模型刪除,接著重新整理tableView。
注意,這裡一定要在self.books
中刪除整個選中的模型陣列
,而不是直接在for
迴圈中直接在self.books
中刪除每個模型。
- (IBAction)removeSelectedCells {
for (NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows) {
[self.books removeObjectAtIndex:indexPath.row];
}
[self.tableView reloadData];
}
這樣雖然看來簡單不少並且不需要一個臨時陣列,但是這種做法是會出現錯誤的。舉例來說,當刪除第一個模型的時候,此時第二個模型的陣列下標變為了0,而indexPath對應的row則是1。也就是說本意是刪除的前兩個模型,那麼實際刪除的則是第一個和第三個模型。所以這種做法並不可取。
相關文章
- javascript實現 checkbox全選和批量刪除功能JavaScript
- php(js)批量刪除/單個刪除PHPJS
- 批量刪除死鎖
- oracle批量刪除表Oracle
- hibernate批量刪除
- 表格的批量重新命名與批量刪除
- 批量刪除 redis keysRedis
- git 批量刪除本地分支Git
- 批量刪除容器和映象
- 批量刪除表CHI_%
- 批量刪除空的資料夾
- 批量刪除檔案中的^M
- 6.12php對資料庫的刪除和批量刪除PHP資料庫
- docker 批量刪除容器和映象Docker
- 批量刪除大量小檔案
- hibernateHQl批量插入、刪除、更新
- Linux批量刪除檔案Linux
- oracle 批量刪除觸發器Oracle觸發器
- MySQL批量刪除指定字首表MySql
- SD--批量刪除訂單
- DB2 批量刪除表DB2
- 如何批量刪除指定的GitHub ReposGithub
- 批量刪除dbms_job建立的job
- 【工具】批量刪除binlog 的指令碼指令碼
- vue+element-ui操作刪除(單行和批量刪除)VueUI
- 儲存系統實現-資料刪除之索引的刪除索引
- 實現 UITableViewCell 側滑操作列表UIView
- liunx批量刪除指定字尾的檔案
- 批量刪除Oracle資料庫的資料Oracle資料庫
- Mac電腦如何批量刪除照片?Mac
- linux 模糊批量刪除檔案Linux
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- Linux下批量刪除空檔案或者刪除指定大小的檔案Linux
- SQL Server 批量刪除重複記錄(批量、快速、安全)SQLServer
- jquery實現增加刪除行jQuery
- oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄) 轉Oracle
- 【轉】oracle 快速刪除大批量資料方法(全部刪除,條件刪除,刪除大量重複記錄)Oracle
- DDD:聚合根的批量刪除是不是可以批量傳送請求