0

我正在创建一个 UITableViewController 来列出人的名字,并在他们的名字旁边加上一个星号来表示喜欢的人

许多细胞之一

触摸时星星会亮起,表示收藏,该单元格的行号进入此方法中调用的 NSMutableArray。

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

当我点击一个单元格并将索引添加到数组时,一切正常,直到我向下滚动,并且填充了更多的星星。它们是随机的,我相信,每次我向上然后向下滚动时都会弹出一些弹出窗口,看起来像这样,褪色的星星......

褪色的星星

这是满星

满星

不知怎的,不该被填满的星星都褪色了。

我无法确定星星在哪里打开。当我滚动到特定单元格时,日志仅显示将星号设置为打开。

我的问题是星星在不应该打开的时候打开了,我的数组很好,我检查了很多次,它必须是 UITableView。

这是我的代码,

我只有那颗星星的两张图片,一张满的,一张空的,还有

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    CustomCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    //    NSLog(@"%i",[[cell.contentView subviews] count]);
    //    NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[cell.contentView subviews]];
    [tableView reloadData];
    UIImageView *star = cell.star;
    NSLog(@"Star Tag: %i",star.tag);

    if (star.tag == kStarEmpty) {
        [[Global sharedGlobal].favTeachers addObject:[NSString stringWithFormat:@"%i",cell.identifierTag]];
        NSLog(@"Added: %i",cell.identifierTag);
     //   NSLog(@"setting star image: 1");
        [star setImage:[UIImage imageNamed:@"star.png"]];
        [star setTag:kStarFilled];
    } else if (star.tag == kStarFilled) {
        [[Global sharedGlobal].favTeachers removeObject:[NSString stringWithFormat:@"%i",cell.identifierTag]];
        NSLog(@"Removed: %i",cell.identifierTag);
      //      NSLog(@"setting star image: 2");
        [star setImage:[UIImage imageNamed:@"star_empty.png"]];
        [star setTag:kStarEmpty];
    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *teacher = [[Global sharedGlobal].teachers objectAtIndex:indexPath.row];

    static NSString *CellIdentifier = @"Cell";

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    UIImageView *starView = [[UIImageView alloc] init];
    starView.image = [UIImage imageNamed:@"star_empty.png"];
    starView.frame = CGRectMake(720, 2, 29, 29); //748,22
    [starView setTag:kStarEmpty];
    cell.star = starView;
    [cell addSubview:starView];

    cell.identifierTag = indexPath.row;

    NSLog(@"This cell's identifier tag: %i",cell.identifierTag);

    cell.textLabel.text = [[Global sharedGlobal].teachers objectAtIndex:indexPath.row];

    for (int i = 0; i < [[Global sharedGlobal].favTeachers count]; i++) {
        int favTeacherTag = [[[Global sharedGlobal].favTeachers objectAtIndex:i] intValue];
        NSLog(@"%i",i);
        NSLog(@"Fav Teacher Tag: %i",favTeacherTag);
        if (cell.identifierTag == favTeacherTag) {
            NSLog(@"found fav teacher: %i",cell.identifierTag);
            NSLog(@"------------------------------------------");
    //        NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[cell.contentView subviews]];

            NSLog(@"setting star image");
            [starView setImage:[UIImage imageNamed:@"star.png"]];
            NSLog(@"Previous star tag: %i",starView.tag);
            [starView setTag:kStarFilled];
            break;
        }

        NSLog(@"--------------------------------");
    }

    return cell;
}

额外信息:

  • cell.identifierTag我有一个用于单元格的自定义类,它将int.

  • 我正在使用情节提要

  • 我在 Storyboard 中使用静态单元格

谢谢!如果您需要更多信息,请发表评论并询问。

4

3 回答 3

2

您需要确保在此处的else块中设置UIImage为:nil

if (cell.identifierTag == favTeacherTag) {
    //your existing code
} else {
    [starView setImage:nil];
};

这是因为单元格被重复使用,您可能会得到一个之前添加了星形图像的单元格。

于 2013-11-13T21:04:46.750 回答
1

在 (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 方法末尾调用 [tableView reloadData]

于 2013-11-13T21:14:37.473 回答
0

经过两天的努力,我终于弄明白了。:D

我添加了这段代码,因为我有时使用相同的 UIImageView 并且每次- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath调用它时都会不断添加图像视图。

UIImageView *starView = [[UIImageView alloc] init];

if (cell.star == nil) {
    starView.image = [UIImage imageNamed:@"star_empty.png"];
    starView.frame = CGRectMake(720, 2, 29, 29); //748,22
    [starView setTag:kStarEmpty];
    cell.star = starView;

    [cell addSubview:starView];
} else if (cell.star != nil) {
    starView = cell.star;
}
于 2013-11-14T01:34:16.437 回答