1.标记:指的是选中某一行,在这一行后面有个符号,常见的是对勾形式
通过修改cell的accessoryType属性来实现,首先,在ViewDidLoad中[tableView setEditing:NO animated:YES];表示把单元格可编辑状态这只为NO
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cellView = [tableView cellForRowAtIndexPath:indexPath]; if (cellView.accessoryType == UITableViewCellAccessoryNone) { cellView.accessoryType=UITableViewCellAccessoryCheckmark; } else { cellView.accessoryType = UITableViewCellAccessoryNone; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } }
当我们选中单元格的时候,调用此函数,首先是indexPath检测选中了哪一行,if判断当前单元格是否被标记,也就是当前单元格风格,是否为UITableViewCellAccessoryCheckmark风格,如果是,则换成UITableViewCellAccessoryNone(不被标记风格)风格,以下是accessoryType四个风格属性
UITableViewCellAccessoryCheckmark
[img]
![](http://dl.iteye.com/upload/attachment/0079/5205/ce85697e-6839-37b6-9616-75fae616b539.png)
[/img]
UITableViewCellAccessoryDetailDisclosureButton
[img]
![](http://dl.iteye.com/upload/attachment/0079/5207/6d6fda26-66a0-389d-bf68-cd7e2e8b0fa0.png)
[/img]
UITableViewCellAccessoryDisclosureIndicator
[img]
![](http://dl.iteye.com/upload/attachment/0079/5209/76f65150-4322-3254-81b6-42f2226725fd.png)
[/img]
UITableViewCellAccessoryNone
[img]
![](http://dl.iteye.com/upload/attachment/0079/5211/606d8e15-189e-3ad0-88a4-2eb67fddb62a.png)
[/img]
2.移动
实现移动单元格就需要把单元格的编辑属性设置为YES,[tableView setEditing:YES animated:YES];
//返回YES,表示支持单元格的移动 -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }
//单元格返回的编辑风格,包括删除 添加 和 默认 和不可编辑三种风格 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleInsert; }
三种风格的分别是:
UITableViewCellEditingStyleDelete
[img]
![](http://dl.iteye.com/upload/attachment/0079/5213/f9e616c5-b61e-3709-beca-f732081b0292.png)
[/img]
UITableViewCellEditingStyleInsert
[img]
![](http://dl.iteye.com/upload/attachment/0079/5215/bbffeaca-9c7e-39fa-8af0-89a0ebed11e5.png)
[/img]
UITableViewCellEditingStyleNone
[img]
![](http://dl.iteye.com/upload/attachment/0079/5217/63509eb1-39f1-3f86-9c2b-f8addb67c5e1.png)
[/img]
实现移动的方法
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath { // 需要的移动行 NSInteger fromRow = [sourceIndexPath row]; // 获取移动某处的位置 NSInteger toRow = [destinationIndexPath row]; // 从数组中读取需要移动行的数据 id object = [self.listData objectAtIndex:fromRow]; // 在数组中移动需要移动的行的数据 [self.listData removeObjectAtIndex:fromRow]; // 把需要移动的单元格数据在数组中,移动到想要移动的数据前面 [self.listData insertObject:object atIndex:toRow]; }
单元格的移动是选中单元格行后面三条横线才可以实现移动的
3.删除
首先是判断(UITableViewCellEditingStyle)editingStyle,所以
//单元格返回的编辑风格,包括删除 添加 和 默认 和不可编辑三种风格 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; }
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle==UITableViewCellEditingStyleDelete) { // 获取选中删除行索引值 NSInteger row = [indexPath row]; // 通过获取的索引值删除数组中的值 [self.listData removeObjectAtIndex:row]; // 删除单元格的某一行时,在用动画效果实现删除过程 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } }
删除了张四 效果图:
[img]
![](http://dl.iteye.com/upload/attachment/0079/5219/d2afa52f-54e3-3d67-8a58-a121fc817047.png)
[/img]
4.添加
实现方法和删除方法相同,首先还是返回单元格编辑风格
//单元格返回的编辑风格,包括删除 添加 和 默认 和不可编辑三种风格 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleInsert; }
为了显示效果明显,在.h文件中声明一个变量i
#import <UIKit/UIKit.h> @interface STViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> { NSInteger i; } @property(strong,nonatomic) NSMutableArray *listData; @property(strong,nonatomic)UITableView *tableView; @property(strong,nonatomic)UITableViewCell *tableViewCell; @end
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle==UITableViewCellEditingStyleDelete) { // 获取选中删除行索引值 NSInteger row = [indexPath row]; // 通过获取的索引值删除数组中的值 [self.listData removeObjectAtIndex:row]; // 删除单元格的某一行时,在用动画效果实现删除过程 [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } if(editingStyle==UITableViewCellEditingStyleInsert) { i=i+1; NSInteger row = [indexPath row]; NSArray *insertIndexPath = [NSArray arrayWithObjects:indexPath, nil]; NSString *mes = [NSString stringWithFormat:@"添加的第%d行",i]; // 添加单元行的设置的标题 [self.listData insertObject:mes atIndex:row]; [tableView insertRowsAtIndexPaths:insertIndexPath withRowAnimation:UITableViewRowAnimationRight]; } }
运行效果图:
[img]
![](http://dl.iteye.com/upload/attachment/0079/5221/9758afbc-6608-3e4a-8c6c-e406563f41e8.png)
[/img]
在删除和添加单元格的用到UITableViewRowAnimation动画效果,它还有其他几种效果,在此不做测试
UITableViewRowAnimationAutomatic UITableViewRowAnimationTop
UITableViewRowAnimationBottom UITableViewRowAnimationLeft
UITableViewRowAnimationRight UITableViewRowAnimationMiddle
UITableViewRowAnimationFade UITableViewRowAnimationNone