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

来源:互联网 发布:如何进行数据预处理 编辑:程序博客网 时间:2024/05/16 15:34

首先先大致说下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
原创粉丝点击