iOS開發——UI進階篇(四)tableView的全局刷新,局部刷新,左滑操作,左滑出現更多按鈕,進入編輯模式,批量刪除,自定義批量刪除


首先創建項目,在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];
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM