1、数据增删改
- 注意:要想改变cell的显示,本质上是对数据模型的更改,处理方法都是现对模型进行增删改,然后刷新显示!
- (IBAction)add {
FLWine *wine = [[FLWine alloc] init];
wine.image = @"newWine";
wine.name = @"女儿红";
wine.money = @"99";
[self.wineArray insertObject:wine atIndex:0];
// [self.tableview reloadData]; //全局刷新
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:0 inSection:0];
// 局部更新插入的cell
[self.tableview insertRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationMiddle];
}
- (IBAction)update {
FLWine *wine = self.wineArray.firstObject;
wine.money = @"9999";
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:0 inSection:0];
// 局部刷新cell
[self.tableview reloadRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationMiddle];
}
- (IBAction)remove {
[self.wineArray removeObjectAtIndex:0];
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:0 inSection:0];
[self.tableview deleteRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationMiddle];
}
2、编辑模式
tableview进入编辑模式,即可对cell进行左滑、移动、批量选择处理等,只需要实现对应的代理方法即可。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 在编辑模式下可以多选,设置该属性后,可以不用实现editingStyleForRowAtIndexPath代理方法
self.tableview.allowsMultipleSelectionDuringEditing = YES;
}
- (IBAction)edite {
// 进入编辑模式
[self.tableview setEditing:YES animated:YES];
}
- (IBAction)remove {
// 批量删除
NSMutableArray *temp = [NSMutableArray array];
for (NSIndexPath *tempIndexP in self.tableview.indexPathsForSelectedRows) {
[temp addObject:self.wineArray[tempIndexP.row]];
}
[self.wineArray removeObjectsInArray:temp];
[self.tableview deleteRowsAtIndexPaths:self.tableview.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationRight];
}
#pragma mark UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.wineArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *wineId = @"wine";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:wineId];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:wineId];
}
FLWine *wine = self.wineArray[indexPath.row];
cell.imageView.image = [UIImage imageNamed:wine.image];
cell.textLabel.text = wine.name;
cell.detailTextLabel.text = wine.money;
return cell;
}
//
/**
当增减按钮按下时,用来处理数据和UI的回调。
8.0版本后加入的UITableViewRowAction不在这个回调的控制范围内,UITableViewRowAction有单独的回调Block。
只要实现这个方法,就拥有左滑删除功能
点击了系统默认的Delete按钮就会调用这个方法(实现了editActionsForRowAtIndexPath代理方法后,此方法将不生效)
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"commitEditingStyle");
}
// 这个回调实现了以后,就会出现更换位置的按钮,回调本身用来处理更换位置后的数据交换。
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
NSLog(@"moveRowAtIndexPath---source:%@---destination:%@", sourceIndexPath, destinationIndexPath);
// cell移动,改变数据模型
if (sourceIndexPath.row > destinationIndexPath.row) {
[self.wineArray insertObject:self.wineArray[sourceIndexPath.row] atIndex:destinationIndexPath.row];
[self.wineArray removeObjectAtIndex:sourceIndexPath.row+1];
} else {
[self.wineArray insertObject:self.wineArray[sourceIndexPath.row] atIndex:destinationIndexPath.row+1];
[self.wineArray removeObjectAtIndex:sourceIndexPath.row];
}
}
// 当前indexPath的Cell是否可以编辑(不实现默认YES)
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
/**
Cell是否可以移动
如返回NO,cell将不具备被拖动功能
*/
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
#pragma mark UITableViewDelegate
// 设置左滑后,cell右侧按钮的文字
- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"删除";
}
/**
cell左滑后,右侧出现多个按钮的情况
*/
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"click action1 ");
[self.wineArray removeObjectAtIndex:indexPath.row];
[self.tableview deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}];
UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"关注" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
NSLog(@"click action2 ");
// 做完相关操作之后,退出编辑模式,能使cell平滑的通过动画回到初始的状态
self.tableview.editing = NO;
}];
return @[action1,action2];
}
/**
返回Cell的编辑样式
UITableViewCellEditingStyleNone 没有编辑样式
UITableViewCellEditingStyleDelete 删除样式 (左边是红色减号)
UITableViewCellEditingStyleInsert 插入样式 (左边是绿色加号)
UITableViewCellEditingStyleDelete|UITableViewCellEditingStyleInsert 多选模式,左边是选中按钮
*/
//- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
// return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
//}
// 这个接口决定编辑状态下的Cell是否需要缩进。
//- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath{
// return YES;
//}
/**
左滑cell开始编辑调用
*/
- (void)tableView:(UITableView*)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"willBeginEditingRowAtIndexPath");
}
/**
左滑cell恢复调用
*/
- (void)tableView:(UITableView*)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"didEndEditingRowAtIndexPath");
}
效果如下:
Simulator Screen Shot - iPhone XR - 2018-12-14 at 16.28.53.png
Simulator Screen Shot - iPhone XR - 2018-12-14 at 16.29.53.png
Simulator Screen Shot - iPhone XR - 2018-12-14 at 16.30.16.png