1

我有一个小问题,它似乎真的很经典(dequeueReusableCellWithIdentifier 重用时混淆了单元格)但我已经看过类似的问题但找不到答案。

所以,经典上下文:我UITableView在情节提要中有一个带有原型单元格,一个带有图像(异步获取),一个带有 UITextView。

让我们关注文本单元格,因为我在这两个方面都遇到了问题,所以我们知道网络不是原因。

当我再次上下滚动时,细胞会混在一起。我认为这是因为我根据cellForRowAtIndexPath函数内部的数据设置了文本值,但我不确定。

这是我的示例中的单元格:

---------------
| 1. "TEXT1"  |
---------------
|             |
| 2. IMAGE2   |
|             |
---------------
| 3. "TEXT3"  |
---------------
| 4. "TEXT4"  |
---------------
|             |
| 5. IMAGE5   |
|             |
---------------

我一直向下滚动,一切都很好。当我在底部弹跳时,重新加载单元格 3 和 4(我在cellForRowAtIndexPath函数中放置了一个 NSLog)。首先重新加载单元格 4,然后重新加载单元格 3(根据日志)。问题是,单元格 3 和 4 都以“TEXT3”作为值!我的意思是,如果我NSLog在函数中给 UITextField.text 的值,它们没有相同的文本值,但在模拟器的屏幕上,它们有..?

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Getting data for row from indexPath
    Data *data = [self.dataArray objectAtIndex:indexPath.row];
    NSString *cellIdentifier = [NSString stringWithFormat:@""];
    if (data.type == 1) { // Text type
        cellIdentifier = @"TextCell";
    }
    else if (data.type == 2){
        cellIdentifier = @"PhotoCell";
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
    // Getting various cell elements

    if (data.type == 1) {
        // Text is 1000
        UITextView *textView = (UITextView *)[tableView viewWithTag:1000];
        textView.text = data.text;
    }
    else if (data.type == 2){
        //STUFF FOR PHOTO TYPE OF DATA
    }

    return cell;
}

顺便说一句,说我在 iOS6 上的模拟器中但在 iOS7 上没有出现此错误可能很有用(但也许这只是不同的内存管理..)

非常感谢你的帮助!

4

2 回答 2

1

我有同样的问题,这就是我解决它的方法。

在我的 CustomTableViewCell 中,我有 init 方法,用于设置标签等的值。

所以我在init中添加了这个条件。

代码:

  • (void) initWithCellLabelString : (NSString *) cellLabelString {

    for (id subview in self.contentView.subviews) { [subview removeFromSuperview]; }

//其余的初始化

}

希望有帮助。

编辑 我这样做的更好方法是覆盖自定义表视图单元格类中的 prepareForReuse 并将值设置为 nil。这可能不是推荐的方法,但我没有遇到任何性能问题。

于 2013-10-10T16:43:07.797 回答
0

我实际上通过测试自己找到了解决方案......我的问题是要访问我的原型单元格中的文本视图,我在情节提要中给了它一个标签。

但是,当我想在 中编辑文本时cellForRowAtIndexPath,我正在使用[tableView viewWithTag:myTag] ,而我应该一直在使用[cell viewWithTag:myTag],所以我正在编辑,我猜,最后一个?

总而言之,现在很好..我只是看错了地方,因为我确定这是关于重用错误的单元格或smth..如果有人知道为什么它没有在 ios7 中发生,请分享!

于 2013-10-10T16:48:03.460 回答