先看效果
今天一个同学让我帮他做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的购物车页面:
购物车页面
数量加减、选不选中、删除商品什么的,其实都是对数据源的修改。
网友评论