首先先大致说下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刷新
}
}
其次,是一些进阶篇
待后续补充....