欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS应用中UITableView左滑自定义选项及批量删除的实现

程序员文章站 2023-10-19 11:51:59
实现uitableview左滑自定义选项 当uitableview进入编辑模式,在进行左滑操作的cell的右边,默认会出现delete按钮,如何自定义左滑出现的按钮呢?...

实现uitableview左滑自定义选项
当uitableview进入编辑模式,在进行左滑操作的cell的右边,默认会出现delete按钮,如何自定义左滑出现的按钮呢?

只需要实现uitableview下面的这个代理方法。

复制代码 代码如下:

- (nsarray<uitableviewrowaction *> *)tableview:(uitableview *)tableview editactionsforrowatindexpath:(nsindexpath *)indexpath
{
    uitableviewrowaction *likeaction = [uitableviewrowaction rowactionwithstyle:uitableviewrowactionstylenormal title:@"喜欢" handler:^(uitableviewrowaction * _nonnull action, nsindexpath * _nonnull indexpath) {
      // 实现相关的逻辑代码
      // ...
      // 在最后希望cell可以自动回到默认状态,所以需要退出编辑模式
      tableview.editing = no;
    }];

    uitableviewrowaction *deleteaction = [uitableviewrowaction rowactionwithstyle:uitableviewrowactionstyledefault title:@"删除" handler:^(uitableviewrowaction * _nonnull action, nsindexpath * _nonnull indexpath) {
      // 首先改变model
      [self.books removeobjectatindex:indexpath.row];
      // 接着刷新view
      [self.tableview deleterowsatindexpaths:@[indexpath] withrowanimation:uitableviewrowanimationautomatic];
      // 不需要主动退出编辑模式,上面更新view的操作完成后就会自动退出编辑模式
    }];

    return @[deleteaction, likeaction];
}


此时左滑就会出现两个按钮,一个是喜欢,另一个是删除。出现的顺序和在这个方法中返回的数组中的元素顺序相关。

如果实现了上述方法,那么之前提到过的tableview:commiteditingstyle:forrowatindexpath:和tableview: titlefordeleteconfirmationbuttonforrowatindexpath:方法就不会再调用了。(如果为了兼容以前的版本,那么需要实现tableview:commiteditingstyle:forrowatindexpath:方法,在这个方法里什么都不用做即可。)


uitableview的多行同时删除
下面这段代码配合xib使用, 不过关键不在这地方,记住后面的使用到的委托。

其实质就是数组array的删除操作。

复制代码 代码如下:

//
//  uitableviewdeltemutilrowsviewcontroller.m
//  uitableviewdeltemutilrows
//

#import "uitableviewdeltemutilrowsviewcontroller.h"

@implementation uitableviewdeltemutilrowsviewcontroller
@synthesize tableview;
@synthesize dataarray;
@synthesize deletedic;
@synthesize leftbutton;
@synthesize rightbutton;
#pragma mark -
#pragma mark view lifecycle


- (void)viewdidload {
    [super viewdidload];
    dataarray = [[nsmutablearray alloc] initwithobjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",nil];
    deletedic = [[nsmutabledictionary alloc] init];

    rightbutton.title = @"编辑";
}

- (ibaction)chosedata{
    if (rightbutton.title == @"编辑") {
        rightbutton.title = @"确定";
        [self.tableview setediting:yes animated:yes];
    }
    else {
        rightbutton.title = @"编辑";
        [deletedic removeallobjects];
        [self.tableview setediting:no animated:yes];
    }

}
- (ibaction)deletefuntion{
    [dataarray removeobjectsinarray:[deletedic allkeys]];
   
    [self.tableview deleterowsatindexpaths:[nsarray arraywitharray:[deletedic allvalues]] withrowanimation:uitableviewrowanimationfade];
    [deletedic removeallobjects];
   
}

- (void)dealloc {
    [leftbutton release];
    [rightbutton release];
    [deletedic release];
    [dataarray release];
    [tableview release];
    [super dealloc];
}
#pragma mark -
#pragma mark table view data source

- (nsinteger)numberofsectionsintableview:(uitableview *)tableview {
    // return the number of sections.
    return 1;
}


- (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section {
    // return the number of rows in the section.
    return [dataarray count];
}


// customize the appearance of table view cells.
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath {
   
    static nsstring *cellidentifier = @"cell";
   
    uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier];
    if (cell == nil) {
        cell = [[[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:cellidentifier] autorelease];
    }
    // configure the cell...
    cell.textlabel.text = [dataarray objectatindex:indexpath.row];
    return cell;
}


/*//这里设置为可滑动编辑删除
 // override to support conditional editing of the table view.
 - (bool)tableview:(uitableview *)tableview caneditrowatindexpath:(nsindexpath *)indexpath {
 // return no if you do not want the specified item to be editable.
 return yes;
 }
 */

- (uitableviewcelleditingstyle)tableview:(uitableview *)tableview editingstyleforrowatindexpath:(nsindexpath *)indexpath
{
    return uitableviewcelleditingstyledelete | uitableviewcelleditingstyleinsert;
}

#pragma mark -
#pragma mark table view delegate

- (void)tableview:(uitableview *)tableview didselectrowatindexpath:(nsindexpath *)indexpath {
    if (rightbutton.title== @"确定") {
        [deletedic setobject:indexpath forkey:[dataarray objectatindex:indexpath.row]];  
    }
    else {
    }
}

- (void)tableview:(uitableview *)tableview diddeselectrowatindexpath:(nsindexpath *)indexpath{
    if (rightbutton.title == @"确定") {
        [deletedic removeobjectforkey:[dataarray objectatindex:indexpath.row]];
    }
}
@end