ios - 发件人有时会发送错误的值

标签 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);

        }];

        }

最佳答案

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

您可以将 setTag 行放在条件之外,这样它会在每次创建/重新使用单元格时始终更新按钮的标签。

或者,您可以确保在 UITableViewCell 的 prepareForReuse 中重用之前从单元格中删除旧按钮或里面 cellForRowAtIndexPathdequeueReusableCellWithReuseIdentifier(...)之后.这样做你必须总是添加新按钮,因为旧按钮已从单元格中删除

关于ios - 发件人有时会发送错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38178061/

相关文章:

ios - 是否有将 UIColor 转换为 Hue Saturation Brightness 的功能?

objective-c - 从另一个 Controller 和 Nib 加载 View

iphone - 获取目录中的文件(及其属性)

ios - AdMob 在已发布的应用程序中显示测试插页式广告

ios - 简单的collectionView动画

ios - NSPredicate 匹配除数字之外的任何内容

ios - Parse.com 查询未加载

ios - 如何计算每个部分中的动态行数

objective-c - insertRowsAtIndexPaths :withAnimation: throws NSRangeException

ios - 更改单元格中的数据后,UITableView 中的自定义单元格不会正确重新加载