在tableView的使用过程中,有时会需要增加或删除某些cell数据.不管是添加还是删除,我们都应该操作
模型
数据,因为cell是会被重新利用的,如果直接对cell进行修改,会导致重用后数据错乱,造成不必要的麻烦.
增加cell数据
在控制器中添加一个按钮,改名为添加,拖线到实现代码中,用来监听点击事件.
添加方法需要记录用户输入的内容,添加到模型中,然后再刷新tableView即可.
在方法中实现以下内容:
- (IBAction)add:(id)sender {
//创建消息控制器
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"请输入团购数据" message:nil preferredStyle:UIAlertControllerStyleAlert];
//添加输入文本框
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"请输入标题";//设置占位文本
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"请输入价格";
}];
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"请输入购买数";
}];
//添加操作按钮
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[alert addAction:[UIAlertAction actionWithTitle:@"确认" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
//创建模型
DLShop *shop = [[DLShop alloc] init];
//设置模型数据
shop.title = [alert.textFields[0] text];
shop.price = [alert.textFields[1] text];
shop.buyCount = [alert.textFields[2] text];
//将新数据添加到数组
[self.shops insertObject:shop atIndex:0];
//刷新表格(可视行,不带动画)
// [self.tableView reloadData];
//刷新表格(单行,带动画,性能优化)
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
}]];
//显示消息框
[self presentViewController:alert animated:YES completion:nil];
}
删除cell数据(单行,系统自带)
在控制器中添加一个按钮,改名为删除,拖线到实现代码中,用来监听点击事件.
系统自带的删除方法实现比较简单,只需实现下面的方法,然后刷新tableView即可.
代码如下:
* 只要实现这个方法,左划cell出现删除按钮的功能就有了
* 用户提交了添加(点击了添加按钮)\删除(点击了删除按钮)操作时会调用
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle == UITableViewCellEditingStyleDelete) {
//删除模型数据
[self.shops removeObjectAtIndex:indexPath.row];
//删除对应行
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
删除cell数据(多行)
在控制器中添加一个按钮,改名为删除,拖线到实现代码中,用来监听点击事件.
删除cell比较简单,只需将选中的数据记录到可变数组,从模型中删除可变数组内容,然后刷新tableView即可.
代码如下:1.在模型中添加一个状态属性
/** 状态量标识有无被打钩 */
@property (assign, nonatomic, getter=isChecked) BOOL checked;
2.在cell中添加一张图片,设置图片的内容为对勾,并设置图片默认隐藏.将图片拖线至自定义类中,修改set方法,设置图片的显示状态(显示或隐藏)
// 设置打钩控件的显示和隐藏
self.checkView.hidden = !deal.isChecked;
3.设置remove方法
- (IBAction)remove:(id)sender {
// 临时数组:存放即将需要删除的团购数据
NSMutableArray *deleteShops = [NSMutableArray array];
//遍历模型数据,取出被选中的数据
for (DLShop *shop in self.shops) {
//将数据添加到可变数组中
if (shop.isChecked) [deleteShops addObject:shop];
}
//删除可变数组的模型数据
[self.shops removeObjectsInArray:deleteShops];
//刷新表格
[self.tableView reloadData];
//清空可变数组
[deleteShops removeAllObjects];
}
删除cell数据(多行,系统自带)
首先添加一个批量操作按钮,拖到实现代码中,监听点击事件,
实现如下代码:
1.
- (void)viewDidLoad {
[super viewDidLoad];
// 允许在编辑模式进行多选操作
self.tableView.allowsMultipleSelectionDuringEditing = YES;
}
2.在批量操作按钮方法下实现:
- (IBAction)multiOperation:(id)sender {
//对选中状态进行取反
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
}
3.在删除按钮实现以下代码:
- (IBAction)remove {
// 获得所有被选中的行
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
// 遍历所有的行号
NSMutableArray *deletedShops = [NSMutableArray array];
for (NSIndexPath *path in indexPaths) {
[deletedShops addObject:self.shops[path.row]];
}
// 删除模型数据
[self.shops removeObjectsInArray:deletedShops];
// 刷新表格 一定要刷新数据
[self.tableView reloadData];
}