带文本和图像的UITableView:在dequeueReusableCellWithIdentifier中混合使用

时间:2013-10-10 16:27:57

标签: iphone ios objective-c uitableview

我有一个小问题,这似乎是非常经典的(当dequeueReusableCellWithIdentifier重用时混合了单元格)但我已经查看了类似的问题,但找不到答案。

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

让我们专注于文本单元格,因为我在两者上都遇到问题,所以我们知道网络不是原因。

当我再次摔倒时,细胞混淆了。我认为这是因为我根据cellForRowAtIndexPath函数中的数据设置了文本值,但我不确定。

以下是我的示例中的单元格:

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

我一直向下滚动,一切都很好。当我在底部反弹时,将重新加载单元格3和4(我将NSLog置于cellForRowAtIndexPath函数中)。重新加载第一个单元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上没有这个错误(但也许只是不同的内存管理......)。

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

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

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

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

代码:

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

    for(self.contentView.subviews中的id子视图){     [subview removeFromSuperview]; }

//其余的init

}

希望有所帮助。

修改 我更好的方法是在Custom表视图单元类中覆盖prepareForReuse并将值设置为nil。它可能不是推荐的方法,但我没有遇到任何性能问题。

答案 1 :(得分:0)

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

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

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