发件人有时会发错值

时间:2016-07-04 06:24:24

标签: ios objective-c

我有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);

        }];

        }

2 个答案:

答案 0 :(得分:2)

我怀疑它在没有更新按钮标签的情况下重复使用旧单元格。由于您有条件if (self.shouldEdit),这意味着并不总是调用[button setTag:indexPath.row];。您提到按钮的目的是删除项目,因此可能是tableView重用旧/已删除的单元格(带有标记8的单元格)作为5个单元格中的一个并且它不会调用setTag

您可以将setTag行置于条件之外,这样每次创建/重用单元格时它都会更新按钮的标记。

或者,您可以确保在单元格中删除旧按钮,然后在prepareForReuse后面的UITableViewCell cellForRowAtIndexPathdequeueReusableCellWithReuseIdentifier(...)内重复使用。执行此操作时,您必须始终添加新按钮,因为旧按钮已从单元格中删除

答案 1 :(得分:0)

每次调用cellForRowAtIndexPath时都会覆盖

按钮标记,因此不要在该方法中设置标记 删除此行

[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)


}