iOS基础知识

cell的增加/删除/更新等操作

2016-04-20  本文已影响376人  letaibai

在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];
}
上一篇下一篇

猜你喜欢

热点阅读