访问了自定义UITableViewCell奇怪的选择行为

时间:2014-02-19 01:05:56

标签: ios objective-c uitableview

我在UITableViewController中遇到了一些奇怪的行为。

我已经将UITableViewCell子类化,并由其中的“visit”属性创建。

- (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时,我发现不仅我选择的单元格变为“已访问”,而且还有另一个单元格。这很难解释,但是如果我选择第一个单元格,第7个单元格也会被访问,如果我选择第二个,第8个也会被访问,依此类推。有谁知道这是为什么,以及我该如何解决它?

我已经检查了this question,但似乎没什么帮助。

1 个答案:

答案 0 :(得分:2)

这是由细胞重用引起的。您需要每次都设置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方法中正确设置值。

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