iOS开发 | 编辑cell的思路和方法

作者: 无夜之星辰 | 来源:发表于2017-05-13 20:20 被阅读730次
沉迷王者荣耀,简书许久没更新,罪过。。。

先看效果

今天一个同学让我帮他做cell编辑功能,效果大致如下:


效果.gif

点击顶部编辑按钮,所有cell变为可编辑状态,按钮文字变为“完成”,cell编辑后点击按钮,所有cell进入不可编辑状态。

思路

cell展示的内容来自数据源,所以,对cell展示内容进行修改,实际上就是对数据源的修改

还是原来的强势

关键点说明

1.关于model

model是数据的载体,cell展示的内容也有model决定,所以model里不仅有3个文本的内容,还有一个标识是否是可编辑状态的属性。

#import <Foundation/Foundation.h>

@interface EditableCellModel : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *range;
@property (nonatomic,copy) NSString *value;

/** 是否是编辑状态 */
@property (nonatomic,assign) BOOL isEditState;

@end

2.编辑cell上的textField如何传值到视图控制器?

用代理,将这个cell和textField一起传过去(传cell是为了获取cell所在的indexPath,传textField是为了获取textField的文本,改变数据源这两个缺一不可):

@class EditableCell;
@protocol EditableCellDelegate <NSObject>

- (void)editableCell:(EditableCell *)editableCell valueTextFieldTextDidChange:(UITextField *)sender;

@end

3.如何改变数据源?

在上述代理方法里进行处理:

#pragma mark - cell的textField文本改变时回调
- (void)editableCell:(EditableCell *)editableCell valueTextFieldTextDidChange:(UITextField *)sender{
    // 获取cell所在行数
    NSInteger row = [self.tableView indexPathForCell:editableCell].row;
    // 获取cell对应的model
    EditableCellModel *cellModel = self.dataArray[row];
    // 修改model
    cellModel.value = sender.text;
}

4.编辑按钮点击的处理

/** 编辑按钮点击 */
- (void)editButtonClicked:(UIButton *)sender{
    // 改变数据源
    for (EditableCellModel *cellModel in self.dataArray) {
        // 是否进入编辑状态取反
        cellModel.isEditState = !cellModel.isEditState;
    }
    
    // 刷新tableView
    [self.tableView reloadData];
    
    // 更新按钮文字
    NSString *editButtonTitle = [sender.titleLabel.text isEqualToString:@"编辑"] ? @"完成" : @"编辑";
    [sender setTitle:editButtonTitle forState:UIControlStateNormal];
}

总结及引申

编辑cell,主要就两步:

  • 第一步:改变数据源
  • 第二步:reloadData

有些cell的编辑虽然看起复杂,但原理也是这样的,比如我们公司的商城APP的购物车页面:


购物车页面

数量加减、选不选中、删除商品什么的,其实都是对数据源的修改。

小demo一份:

demo

相关文章

网友评论

本文标题:iOS开发 | 编辑cell的思路和方法

本文链接:https://www.haomeiwen.com/subject/dabxxxtx.html