使用cellForRowAtIndexPath:方法修改现有的可重用单元格

时间:2013-02-06 09:43:57

标签: iphone ios uitableview

我使用tableview和可重复使用的单元格。在每个单元格上,我有一个带文本的textField,我可以修改它。如果文本为空,我删除该单元格。

让我们说我们有100行,我们想修改第1行:我们点击它,给空字符串@“”,向下滚动到第50位,然后点击这个单元格。

现在我们要检测另一个单元格上的点击手势,我调用方法textFieldDidEndEditing:看看我是否应该从tableview中删除此单元格。我使用cellForRowAtIndexPath:获取修改后的单元格。

问题是出现了其他带有textField的单元格。我删除修改过的单元格,但只删除一个。我认为这是可重复使用的细胞的问题。

任何人都可以帮我解决这个问题吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *ImageIdentyfier = @"StandardCellWithImageIdentifier";

    StandardCellWithImage *cellImage = (StandardCellWithImage *)[tableView dequeueReusableCellWithIdentifier:ImageIdentyfier];

    if(cellImage == nil) {
        cellImage = [[StandardCellWithImage alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ImageIdentyfier];
    }
    cellImage.nameLabel.delegate = self;
    Item *item  = [self.mutableFetchResults objectAtIndex:indexPath.row];
    cellImage.nameLabel.text = item.itemText;
    cellImage.infoLabel.text = item.itemInfo;
    cellImage.checkbox.userInteractionEnabled = YES;
    cellImage.nameLabel.userInteractionEnabled = NO;
    if(item.itemIsChecked.boolValue == YES) {
        cellImage.checkbox.tag = indexPath.row;
        [cellImage.tapGesture addTarget:self action:@selector(didSelectedImageAtIndexPath:)];
        cellImage.checkbox.image = [UIImage imageNamed:@"checkbox-checked.png"];
    } else {
        cellImage.checkbox.tag = indexPath.row;
        [cellImage.tapGesture addTarget:self action:@selector(didSelectedImageAtIndexPath:)];
        cellImage.checkbox.image = [UIImage imageNamed:@"open-checkbox.png"];
    }
    return cellImage;
}

2 个答案:

答案 0 :(得分:1)

从第1行滚动到第50行时,将重用已存在的单元格 - 包括具有空textField的单元格。这就是为什么你多次看到它以及为什么你的删除例程只删除了一个而不是全部。

听起来像cellForRowAtIndexPath方法创建的单元格需要修复,以确保空文本字段不会自动复制到回收的单元格。没有看到任何代码,这个练习留给你。

看着代码,thanx。无法看到任何“简单”修复,因此建议您避免问题。因此,您可以检查列表滚动,而不是检查单元格点击。

您遇到的问题只是因为正在编辑的单元格因用户滚动列表而被回收。因此,通过以下方法消除问题:a)不要让用户在编辑文本时滚动,或b)在用户开始滚动时停止文本编辑。

答案 1 :(得分:1)

当你的textFieldDidEndEditing被调用完毕时,你应该检查文本是"",如果它是""我认为你应该从dataSource删除它然后{ {1}}

你的reloadData方法应该这样写:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath