標籤:
首先建立項目,在storyboard如下布局控制項,設定好約束
然後建立cell模型類XMGWineCell
資料模型類XMGWine
建立UITableView,設定資料來源協議,實現資料來源方法
懶載入資料
這些在前面已經做過很多次了,代碼就不一一寫了
一、全域重新整理
1、添加單組資料並全域重新整理
- (IBAction)add { // 添加模型資料 XMGWine *wine = [[XMGWine alloc] init]; wine.money = @"20.5"; wine.name = @"很好喝的酒"; wine.image = @"new_wine"; [self.wineArray insertObject:wine atIndex:0]; // 告訴tableView:模型資料改變了,趕緊重新整理表格 [self.tableView reloadData];}
2、刪除單組資料並全域重新整理
- (IBAction)remove { // 刪除模型資料 [self.wineArray removeObjectAtIndex:0]; [self.wineArray removeObjectAtIndex:0]; // 告訴tableView:模型資料改變了,趕緊重新整理表格 [self.tableView reloadData];}
3、更改資料並全域重新整理
- (IBAction)update { // 更改模型資料 XMGWine *wine = self.wineArray[0]; wine.money = @"100"; XMGWine *wine2 = self.wineArray[1]; wine2.name = @"哈哈"; // 告訴tableView:模型資料改變了,趕緊重新整理表格 [self.tableView reloadData];}
二、局部重新整理
1、添加多組資料並局部重新整理
- (IBAction)add { // 添加模型資料 XMGWine *wine = [[XMGWine alloc] init]; wine.money = @"20.5"; wine.name = @"很好喝的酒"; wine.image = @"new_wine"; [self.wineArray insertObject:wine atIndex:0]; XMGWine *wine2 = [[XMGWine alloc] init]; wine2.money = @"100.5"; wine2.name = @"很好"; wine2.image = @"new_wine"; [self.wineArray insertObject:wine2 atIndex:0]; // 重新整理 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0] ]; [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];}
2、刪除多組資料並局部重新整理
- (IBAction)remove { // 刪除模型資料 [self.wineArray removeObjectAtIndex:0]; [self.wineArray removeObjectAtIndex:0]; // 重新整理 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0] ]; [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle];}
3、修改多項資料並局部重新整理
- (IBAction)update { // 更改模型資料 XMGWine *wine = self.wineArray[0]; wine.money = @"100"; XMGWine *wine2 = self.wineArray[2]; wine2.image = @"new_wine"; XMGWine *wine3 = self.wineArray[3]; wine3.image = @"new_wine"; // 局部重新整理 NSArray *indexPaths = @[ [NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:2 inSection:0], [NSIndexPath indexPathForRow:3 inSection:0] ]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft];}
三、左滑操作
先設定代理
1、只要實現了這個方法,左滑出現Delete按鈕的功能就有了
點擊了“左滑出現的Delete按鈕”會調用這個方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ // 刪除模型 [self.wineArray removeObjectAtIndex:indexPath.row]; // 重新整理 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];}
2、修改Delete按鈕的文字
/** * 修改Delete按鈕文字為“刪除” */- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{ return @"刪除";}
四、左滑出現更多按鈕
/** * 左滑cell時出現什麼按鈕 */- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewRowAction *action0 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"關注" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { NSLog(@"點擊了關注"); // 收回左滑出現的按鈕(退出編輯模式) tableView.editing = NO; }]; UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"刪除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { [self.wineArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; }]; return @[action1, action0];}
五、進入編輯模式
我們先將刪除按鈕改一改
- (IBAction)remove { // (上面的沒動畫效果,下面有動畫效果)// self.tableView.editing = !self.tableView.isEditing; [self.tableView setEditing:!self.tableView.isEditing animated:YES];}
點擊按鈕之後左邊會出現紅色圓點,點擊紅點的效果和左滑是一樣的,都可以進入編輯模式
六、大量刪除
重新設定按鈕
// 大量刪除按鈕- (IBAction)multipleRemove { [self.tableView setEditing:!self.tableView.isEditing animated:YES]; self.removeButton.hidden = !self.tableView.isEditing;}- (IBAction)remove { // self.tableView.indexPathsForSelectedRows = [0, 1] // 獲得需要刪除的酒模型資料 NSMutableArray *deletedWineArray = [NSMutableArray array]; for (NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows) { [deletedWineArray addObject:self.wineArray[indexPath.row]]; } // 刪除模型資料 [self.wineArray removeObjectsInArray:deletedWineArray]; // 重新整理 [self.tableView deleteRowsAtIndexPaths:self.tableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationLeft];}
並且在viewDidLoad中設定
// 編輯模式的時候可以多選 self.tableView.allowsMultipleSelectionDuringEditing = YES; // 隱藏刪除按鈕 self.removeButton.hidden = YES;
以上代碼就能實現系統內建的大量刪除
七、自訂大量刪除
功能:在選中後添加一個圖片來標記,所有標記的都可以大量刪除
1、首先在資料模型XMGWine中添加屬性checked
/** 是否被勾選 */@property (nonatomic, assign, getter=isChecked) BOOL checked;
2、實現代理方法,判斷打鉤控制項顯示還是隱藏
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ // 修改模型 XMGWine *wine = self.wineArray[indexPath.row]; wine.checked = !wine.isChecked; // 重新整理 [tableView reloadData];}
注意:核心思想 "修改資料模型從而達到修改cell模型的目的"
如果直接在cell上添加一個圖片來標記選定與否,那麼在cell複用時會出現問題,你會發現往下滑 下面的有些cell也有圖片標記,記住,一般MVC模式中都是修改資料
那麼在這裡我們已經修改了wine.checked的值,下一步在cellForRowAtIndexPath方法中賦值時(也就是說在要顯示cell之前),在- (void)setWine:(XMGWine *)wine方法中實現下面這一句
// 根據模型的checked屬性決定打鉤控制項顯示還是隱藏 self.checkImageView.hidden = !wine.isChecked;
3、刪除所有被打鉤的模型
- (IBAction)remove { // 獲得所有被打鉤的模型 NSMutableArray *deletedWineArray = [NSMutableArray array]; for (XMGWine *wine in self.wineArray) { if (wine.isChecked) { [deletedWineArray addObject:wine]; } } // 刪除所有被打鉤的模型 [self.wineArray removeObjectsInArray:deletedWineArray]; // 重新整理表格 [self.tableView reloadData];}
因為上傳圖片總是失敗,以後再補上。。。
八.總結
這部分內容看起來方法挺多的,但都比較簡單,不過雖然簡單,但是沒有真正去敲就不會發現你那一塊知識點有漏洞
恩,就這樣~
IOS開發——UI進階篇(四)全域重新整理,局部重新整理,左滑操作,左滑出現更多按鈕,進入編輯模式,大量刪除,自訂大量刪除