我有带有自定义流布局的 UICollectionView
,目的是可以删除项目。为了检索索引,我使用函数:
-(void)aMethod:(UIButton*)sender{
[self.viewModel deleteAt:[sender tag]];
[self.myCollectionView reloadData];
}
有时(在极少数情况下)我会崩溃。当我深入研究它时,我发现有时 [sender tag]
是不正确的,事实上,它比项目数组的数量要多。为什么会这样?我发现它发送 8,而数组只有 5 个项目。
按钮是简单的 40x40 宽/高图像,像这样放置在 UITableViewCell 上方:
UIButton *button = [UIButton new];
[button setImage:[UIImage imageNamed:@"m_delete"] forState:UIControlStateNormal];
if (self.shouldEdit){
self.layout.longPressGestureRecognizer.minimumPressDuration = 0.3f;
NSLog(@"1 blk called");
[button addTarget:self
action:@selector(aMethod:)
forControlEvents:UIControlEventTouchUpInside];
[button setTag:indexPath.row];
[cell addSubview:button];
[button mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(cell.mas_left).with.offset(2);
make.top.equalTo(cell.mas_top).with.offset(2);
}];
}
最佳答案
我怀疑它是在不更新按钮标签的情况下重用旧单元格。既然你有条件if (self.shouldEdit)
这意味着 [button setTag:indexPath.row];
并不总是被调用。您提到按钮的目的是删除项目,因此 tableView 可能将旧的/已删除的单元格(带有标签 8 的单元格)重新用作 5 个单元格之一,并且它不调用 setTag
您可以将 setTag 行放在条件之外,这样它会在每次创建/重新使用单元格时始终更新按钮的标签。
或者,您可以确保在 UITableViewCell 的 prepareForReuse
中重用之前从单元格中删除旧按钮或里面 cellForRowAtIndexPath
在dequeueReusableCellWithReuseIdentifier(...)
之后.这样做你必须总是添加新按钮,因为旧按钮已从单元格中删除
关于ios - 发件人有时会发送错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178061/