我有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);
}];
}
答案 0 :(得分:2)
我怀疑它在没有更新按钮标签的情况下重复使用旧单元格。由于您有条件if (self.shouldEdit)
,这意味着并不总是调用[button setTag:indexPath.row];
。您提到按钮的目的是删除项目,因此可能是tableView重用旧/已删除的单元格(带有标记8的单元格)作为5个单元格中的一个并且它不会调用setTag
您可以将setTag行置于条件之外,这样每次创建/重用单元格时它都会更新按钮的标记。
或者,您可以确保在单元格中删除旧按钮,然后在prepareForReuse
后面的UITableViewCell cellForRowAtIndexPath
或dequeueReusableCellWithReuseIdentifier(...)
内重复使用。执行此操作时,您必须始终添加新按钮,因为旧按钮已从单元格中删除
答案 1 :(得分:0)
按钮标记,因此不要在该方法中设置标记 删除此行
[button setTag:indexPath.row];
使用这个
-(void)aMethod:(UIButton*)sender
{
CGPoint point=[sender convertPoint:CGPointZero toView:collectiewname];
NSIndexPath *indexPath=[collectiewname indexPathForItemAtPoint:point];
NSLog(@"row :%ld",(long)indexPath.row)
}