我对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;
}
答案 0 :(得分:1)
是的,它是重用UITableView的单元格属性。 所以从你的代码中删除这一行:
// create accessory view
UIImage *image = [UIImage imageNamed:@"u12_normal.png"];
cell.accessoryView = [[UIImageView alloc] initWithImage:image];
将其放在您更改此图片的其他部分
您还可以看到链接
答案 1 :(得分:0)
这种情况正在发生,因为你正在重复使用细胞。如果需要显示复选标记,则将其添加到您的单元格。但是,如果不需要,则不将图像设置为空白/零。
当重复使用已有此图像的单元格时,您永远不会告诉它删除复选标记。
我建议您在单元格为view1
时添加nil
附件子视图,以便子视图始终存在。然后,如果您的库存需要复选标记,请设置图像。如果不需要复选标记,请将图像设置为nil
。
旁注:一般情况下,当单元格为nil
时,仅将子视图添加到可重用单元格。如果您将子视图添加到现有单元格,那么很可能您最终会在单元格中拥有该子视图的倍数。