[IOS]关于UITableView行的增加和删除

首先先大致说下UITableView的增加删除的原理机制.

第一步:在TableView加载完全之后,此时默认表格是不允许改变的,那如何才能对其进行增加或者删除呢,那么首先得先把表格的editing属性修改为YES.这个editing属性是UITableView的一个属性值,可以通过UITableView的- (void)setEditing:(BOOL)editing animated:(BOOL)animate方法来设置(当然也可以直接用赋值的方式来修改该属性值,但是这样的话就没动画效果了).

第二步:当把上面第一步所描述的UITableView的editing属性修改为YES之后,这个时候UITableView会调用其代理UITableViewDelegate的- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath方法,该方法有两种返回值,一种是UITableViewCellEditingStyleDelete,一种是UITableViewCellEditingStyleInsert(默认返回是前一种),如果该方法的返回值是UITableViewCellEditingStyleDelete那么此时在表格行的左边会有一个删除的按钮,若该方法返回值是UITableViewCellEditingStyleInsert则左边会有一个添加按钮.

第三步:当点击了第二步中单元格左边的删除(或者添加按钮)之后,UITableView会调用其代理UITableViewDataSource的- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath方法,其中入参editingStyle的值根据点击的是删除还是添加按钮分别为UITableViewCellEditingStyleDelete或者UITableViewCellEditingStyleInsert. 当代理中实现了这个办法(只要实现了,即使是空方法),那么当你滑动单元行的时候,他会在右侧出现一个Delete按钮.

第四步:这时主要就需要实现第三步中的- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath方法了.如果这个方法是空方法,那么即使你点击第二步中出现的删除或是添加按钮(或者点击 滑动单元行后在其右边出现的Delete按钮)不会有任何反应,你需要在该方法中实现删除的一些动作,这个动作就看你自己想法了,你可以在这之中先修改表格load时的数据,然后然表格重新load,但是这种可能影响性能,你可以先修改表格load的数据,然后再调用UITableView的insertRowsAtIndexPaths:withRowAnimation:或者deleteRowsAtIndexPaths:withRowAnimation:方法来对单个单元格来进行添加或删除.示例代码参见如下(此代码摘自别的博客,链接请参见我前面关于UITableView的博文):

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    KCContactGroup *group =_contacts[indexPath.section];
    KCContact *contact=group.contacts[indexPath.row];
    if (editingStyle==UITableViewCellEditingStyleDelete) {
        [group.contacts removeObject:contact];
        //考虑到性能这里不建议使用reloadData
        //[tableView reloadData];
        //使用下面的方法既可以局部刷新又有动画效果
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];
        
        //如果当前组中没有数据则移除组刷新整个表格
        if (group.contacts.count==0) {
            [_contacts removeObject:group];
            [tableView reloadData];
        }
    }else if(editingStyle==UITableViewCellEditingStyleInsert){
        KCContact *newContact=[[KCContact alloc]init];
        newContact.firstName=@"first";
        newContact.lastName=@"last";
        newContact.phoneNumber=@"12345678901";
        [group.contacts insertObject:newContact atIndex:indexPath.row];
        [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationBottom];//注意这里没有使用reladData刷新
    }
}


其次,是一些进阶篇

待后续补充....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值