day10-自定义删除
2020-06-08 本文已影响0人
js_huh
数据刷新01全局刷新
数据刷新02局部刷新
左滑删除
滑动时自定义多个按钮
单选编辑模式
批量删除
是什么?
- 为什么需要,鼠标离开了那行cell,才能显示按钮?
默认的动画模式(UITableViewRowAnimationNone
),就是这样得.全局刷新([self.tableView reloadData]
)采用的就是默认的动画模式.
将它更改为,局部刷新,且动画模式淡入淡出(UITableViewRowAnimationFade
)即可 :
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
-
问: 系统自带的cell的模式中,有如图所示的模式吗?
没有,所以只能自定义cell了. -
问: 自定义cell是怎么创建得?
1.创建继承自UITableViewCell
的cell
2.重写initWithStyle: reuseIdentifier :
方法. -
问: 自定义cell的方法里面,做哪些事情?
1.自定义cell,在原有的cell的基础上,再添加自己额外的控件
2.创建带有右侧图片的cell,且将此图片隐藏.
//重写创建cell的方法
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { //在原有cell的基础上,添加自己额外的控件.
UIImageView * imgTemp = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"check"]];
imgTemp.hidden = YES;
[self.contentView addSubview:imgTemp];
self.checkImageView = imgTemp;
}
return self;
}
- 问:
layoutSubviews
方法里面做了哪些事情?
设置cell中子控件的位置.(打钩图片的位置)
//设置子控件的位置
- (void)layoutSubviews{
[super layoutSubviews];
//设置'勾选图片'的位置
CGFloat checkWH = 24;
CGFloat checkX = self.contentView.frame.size.width - checkWH -10;
CGFloat checkY = self.contentView.frame.size.height * 0.5 - checkWH* 0.5;
self.checkImageView.frame = CGRectMake(checkX, checkY, checkWH, checkWH);
//调整cell里内容的宽度
CGRect textFrame = self.textLabel.frame;
textFrame.size.width = self.textLabel.frame.size.width - checkWH -10;
self.textLabel.frame = textFrame;
}
-
问: 怎么调用创建好的自定义cell?
tableView: cellForRowAtIndexPath:
方法里面,使用initWithStyle: reuseIdentifier :
方法创建cell. -
问: 怎么将各个cell的数据,添加到自定义cell里面?
1.自定义cell里面, 创建个'类型Wine属性',重写setWine
方法.
2.在setWine
方法里面,将传递进来的数据,赋值给自定义cell的对应控件.
3.ViewController里将数据,传递进来.
initWithStyle: reuseIdentifier :
创建自定义cell.
cell.wine = 数据
,调用setWine
方法. -
问: cell在什么时候,显示/隐藏打钩的图片?
1.- tableView : didSelectRowAtIndexPath:
// 在选中cell的时候.
2.选中cell的时候,更改'图片显示状态的属性'
当图片显示状态为Y,则改为N. 状态为N,则改为Y。
wine.check = !wine.check;
- 问: 怎么将打钩图片显示出来?
1.'类型Wine'中要添加一个属性,'图片显示状态的属性'.
2.在重写的setWine
方法中,根据图片的显示状态来显示/隐藏图片控件.
//重写wine,给对应的子控件赋值
-(void)setWine:(Wine *)wine{
_wine = wine;
self.textLabel.text = wine.name;
self.imageView.image = [UIImage imageNamed:wine.image];
self.detailTextLabel.text = [NSString stringWithFormat:@"¥%@",wine.money];\
if (wine.iSCheck) {//显示打钩图片
self.checkImageView.hidden = NO;
}else{ //隐藏打钩图片
self.checkImageView.hidden = YES;
}
}
- 问: 选中行删除怎么实现?
1.判断'数据源集合'里,哪些'图片显示状态'为Y。
2.将为Y的类,全部放在临时的可变集合中.
3.在'数据源集合'里,删除对应的数据。
[self.wineArray removeObjectsInArray:delArray];
- (IBAction)removeBtn{
NSMutableArray * delArray = [NSMutableArray array];
NSArray<NSIndexPath *> *indexPaths;
for (Wine* wineTemp in self.wineData) {
if (wineTemp.check) {
[delArray addObject:wineTemp];
}
}
//'数据源'删除数据
[self.wineData removeObjectsInArray:delArray];
//刷新数据列表-全局刷新
[self.tableView reloadData];
}
注意:
原则:
- 遍历一个数组时,要保证数组长度不变
虽然删除的是对象而不是索引。这样写,没有问题.但是不建议这样做.
推荐: 先用可变数组保存需要删除的cell, 然后,直接删除数组。 - 在
tableView:
中通过修改模型,而去影响界面。
不要直接修改界面.(因为存在循环利用)
如: 通过删除数据源里的'数据',而去删除数据所对应的cell
。