我使用自定义修改操作,然后在按下操作后按indexPath
编辑行
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewRowAction *DeleteButton = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];
UISwitch *Switch = [[UISwitch alloc] initWithFrame: CGRectMake(0,0,0,0)];
[cell.contentView addSubview:Switch];
}];
return @[DeleteButton];
}
这会向按下UISwitch
操作按钮的单元格添加Delete
,然而每12行重复一次;所有索引路径都不同(0-1) - (0-2)..等等。
我个人认为这是因为用于抓住此行中的单元格的方法造成的
UITableViewCell *cell = (UITableViewCell*)[tableView cellForRowAtIndexPath:indexPath];
答案 0 :(得分:1)
按照设计,细胞被重新使用,因为细胞从屏幕顶部滚动,新鲜细胞从底部向上滚动。除非你特别选择退出这种行为,否则它会准确地解释你正在观察的内容。如果在可见的单元格上设置任何属性(无论是标签上的文本,还是正在添加子视图),那么这些更改都需要取消,以便在“重复使用”单元格时“或者回收,在您不期望或不希望的情况下,修改仍然不可见。
此问题的一个解决方案是使用UITableViewCell
的自定义子类,而不是将切换子视图添加到标准UITableViewCell
。您可以为自定义子类提供一个属性,该属性引用了您在rowAction方法中添加的子视图开关。此引用使您能够在以后删除或隐藏它。
您可以考虑将切换设置为自定义单元格contentView
中始终存在的子视图,但操作方法会隐藏或显示该视图。
在您的子类中,您将覆盖-prepareForReuse
方法,并且您将从自定义单元格的内容视图中删除或隐藏子视图,以准备要在新的上下文中呈现的单元格(例如,没有添加的开关当你没想到的时候。)
创建自定义单元格子类:
@interface SampleCellTableViewCell : UITableViewCell
@property (weak, nonatomic) UISwitch *aSwitch;
@end
@implementation SampleCellTableViewCell
- (void)prepareForReuse
{
[[self aSwitch] removeFromSuperview];
[self setaSwitch:nil];
}
@end
在您的操作方法中,指定属性:
-(NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewRowAction *DeleteButton = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"Delete" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath)
{
SampleTableViewCell *cell = (SampleTableVieCell*)[tableView cellForRowAtIndexPath:indexPath];
UISwitch *switch = [[UISwitch alloc] initWithFrame: CGRectMake(0,0,0,0)];
[cell.contentView addSubview:switch];
[cell setaSwitch:switch];
}];
return @[DeleteButton];
}