如何修复uitableviewcell重用的自定义子类的问题?

时间:2014-07-07 18:42:35

标签: ios objective-c uitableview

在我被钉在十字架上之前,让我说明一下......是的,我已经阅读了每一个相关的"回答这个问题并没有找到可行的解决方案。大多数"纠正"答案是预先ARC并讨论"发布"一个细胞,现在还没有完成。其次,我的问题不是"全球",这意味着一些观点没有问题,而其他观点则没有。所以这是我的问题......

我对uitableviewcell进行了细分,并设置了一些uilabels& amp;自定义uiviews。从那里我用ib连接所有东西(Xcode 5.x iOS 7.x)。一旦我输入适当的代码并创建tableview&来自nsarray的动态细胞"不可变的"一切都按预期完成,没有任何问题。

这是有趣的部分。我正在进行更改以允许tableview的数据源,这是一个nsarray是可变的,允许添加和删除项目/单元格。这是事情变得多毛的地方。当我开始向数组添加更多对象时,当重用单元格被放置在屏幕上时,来自旧单元格的可视数据将被重新用于新单元格。我说" visual"因为一旦选择了单元格,视图就会更新以显示正确的信息。有趣的部分是,正如我所说,我有一些uilabels永远不会有重新显示任何问题,但我的自定义视图现在是显示过去单元格信息的拼图,当向上滚动时,原始单元格不再显示正确的信息。轻敲单元格后,单元格将更新并显示正确的信息。

最令人困惑的是,在我的数组可变并具有静态数量的对象之前,这个工作正常。即使一个单元格离开屏幕并返回,它仍然显示正确的信息。现在我知道它不应该与它有任何关系,但奇怪的是它使用相同的tableview&我正在使用的单元格代码。

我尝试过加入

MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

if (!cell) {
     cell = [[MyCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; // note: obviously as stated, tacking on "autorelease" here as mention in other suggestions is not going to work.
}

哪个问题无法解决问题。

我尝试重写" prepareForReuse"我的自定义单元子类上的方法,也没有解决问题。我已经提出了这些观点,并且#34;强大的" &安培; "弱",并且所有这些以及仍然每隔3个左右的单元格都会被垃圾数据重复,直到刷新为止。同样,与视图设置方式相同的uilabels没有问题,数据永远不会被重用。我会说我的自定义视图有问题,但是从相同信息的静态源设置表没有问题。

我想发布一些代码,但它们都是非常通用的tableviews代码。与会代表。任何建议将不胜感激。

正如我所说的那些代码都非常通用,但显然它还需要冒充,所以这里就是..

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

    MyThing *thing = self.stuffArray[indexPath.row];

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    cell.thisLabel.text = thing.someText;
    cell.thatLabel.text = thing.otherText;

    cell.view1.someProptery = thing.object1.property
    cell.view2.someProptery = thing.object2.property
    cell.view3.someProptery = thing.object3.property 
    //"someProperty" on "view..." is an NSInt that is used to determine custom drawing in the view.

    return cell;
}

1 个答案:

答案 0 :(得分:1)

我认为解决方案的关键在于您对单元格中自定义视图的评论。如果cellForRowAtIndexPath正在改变这些视图的状态,则需要知道它们必须重新绘制,因此您需要在自定义view.m中扩充具有someProperty的合成setter。

如果someProperty确定了如何绘制这个视图,那么设置者有责任表明该视图已过时....

- (void)setSomeProperty:(NSInteger)someInt {
    _someProperty = someInt;
    [self setNeedsDisplay];
}