在UITableView中滚动会使图像显示在不存在的单元格上

时间:2014-08-18 13:33:02

标签: ios objective-c uitableview

我对UITableView有一个奇怪的问题。我将一个复选标记图像添加到没有将date属性设置为当前日期的所有单元格。当填充tableview时,它似乎工作正常,因为没有日期的第一个元素没有显示复选标记。当我向下滚动到具有正确日期的第一个单元格时,会显示复选标记。当我向上滚动时,所有单元格中都会显示复选标记。为什么会这样?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"InventoryingSearchResultCell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleDefault;
        cell.backgroundColor = [UIColor clearColor];

        UIView *selectionColor = [[UIView alloc] init];
        selectionColor.backgroundColor = myAppDelegate.config.appTheme;
        cell.selectedBackgroundView = selectionColor;

        // create accessory view
        UIImage *image = [UIImage imageNamed:@"u12_normal.png"];
        cell.accessoryView = [[UIImageView alloc] initWithImage:image];
    }

    // fill in data
    NSDictionary *item = [searchResult objectAtIndex:indexPath.row];
    NSString *inventoryDate;
    inventoryDate = [item valueForKey:@"InventoryDate"];
    if (![inventoryDate isEqual:[NSNull null]]){
        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
        NSDate *date = [dateFormat dateFromString:inventoryDate];

        if ([self hasBeenInventoried:date]) {
            UIImage *image1 = [UIImage imageNamed:@"tick.png"];
            UIImageView *view1 = [[UIImageView alloc] initWithFrame:CGRectMake(16, 40, 16, 16)];
            view1.image = image1;
            [cell.accessoryView addSubview:view1];
        }
    } else {
        inventoryDate = @"";
    }
    return cell;
}

2 个答案:

答案 0 :(得分:1)

是的,它是重用UITableView的单元格属性。 所以从你的代码中删除这一行:

    // create accessory view
    UIImage *image = [UIImage imageNamed:@"u12_normal.png"];
    cell.accessoryView = [[UIImageView alloc] initWithImage:image];

将其放在您更改此图片的其他部分

您还可以看到链接

Check and uncheck the same UITableViewCell

答案 1 :(得分:0)

这种情况正在发生,因为你正在重复使用细胞。如果需要显示复选标记,则将其添加到您的单元格。但是,如果不需要,则不将图像设置为空白/零。

当重复使用已有此图像的单元格时,您永远不会告诉它删除复选标记。

我建议您在单元格为view1时添加nil附件子视图,以便子视图始终存在。然后,如果您的库存需要复选标记,请设置图像。如果不需要复选标记,请将图像设置为nil


旁注:一般情况下,当单元格为nil时,仅将子视图添加到可重用单元格。如果您将子视图添加到现有单元格,那么很可能您最终会在单元格中拥有该子视图的倍数。