【问题标题】:visited custom UITableViewCell weird selection behavior访问自定义 UITableViewCell 奇怪的选择行为
【发布时间】:2014-02-19 01:05:56
【问题描述】:

我的UITableViewController 出现了一些奇怪的行为。

我对 UITableViewCell 进行了子类化,并在其中创建了自己的“已访问”属性。

- (void)setVisited:(BOOL)visited animated:(BOOL)animated
{
    [self setVisited:visited];
    ...
}

当我在tableView:cellForRowAtIndexPath:(我创建它的唯一地方)中创建单元格时,我设置了这个属性,如下所示:

if (cell == nil) {
    cell = [[ArticleListViewCell alloc] initWithReuseIdentifier:CellIdentifier art:art index:indexPath.row];
    [cell setVisited:NO animated:NO];
}

后来,在tableView:didSelectRowAtIndexPath:,我将此属性设置为YES

ArticleListViewCell *cell = (ArticleListViewCell *) [tableView cellForRowAtIndexPath:indexPath];
[cell setVisited:YES animated:NO];

但是,当我选择一个单元格然后返回到当前有 10 个单元格的 UITableView 时,我发现不仅我选择的单元格“已访问”,而且另一个单元格也有。很难解释,但如果我选择第 1 个单元格,第 7 个单元格也会被访问,如果我选择第 2 个单元格,第 8 个单元格也会被访问,依此类推。有谁知道这是为什么,以及我应该如何解决它?

我检查了this question,但似乎没有多大帮助。

【问题讨论】:

  • 细胞被重复使用,所以这就是你得到这个结果的原因。您需要跟踪任何已访问单元格的索引路径。

标签: ios objective-c uitableview


【解决方案1】:

这是由单元重用造成的。您需要每次都设置visited,而不仅仅是在创建单元格时。

if (cell == nil) {
    cell = [[ArticleListViewCell alloc] initWithReuseIdentifier:CellIdentifier art:art index:indexPath.row];
}

BOOL visited = ... // value for this indexPath
[cell setVisited:visited animated:NO];

在您的didSelectRow 方法中,您需要更新某种数据结构来跟踪已访问的行。您可以使用此数据在 cellForRow 方法中正确设置值。

不要使用单元格来跟踪状态。单元格是一个视图。您的数据源需要跟踪状态。

【讨论】:

  • 谢谢——我应该将状态保存在数据源中;我很困惑为什么观点会以这种特殊的方式发生变化。
猜你喜欢
  • 2014-10-06
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多