在 cellForRowAtIndexPath 的 UITableViewCell 的子类中显示 UIImageView

Posted

技术标签:

【中文标题】在 cellForRowAtIndexPath 的 UITableViewCell 的子类中显示 UIImageView【英文标题】:Displaying UIImageView in a subclass of UITableViewCell in cellForRowAtIndexPath 【发布时间】:2012-02-02 16:14:50 【问题描述】:

我的 UITableViewCell 子类中有一个 DotImageView 属性。

@property (nonatomic, retain) IBOutlet UIImageView *DotImageView;

我尝试在 cellForRowAtIndexPath 方法中这样显示:

static NSString *TargetCellIdentifier = @"TargetDetailTableViewCellIdentifier";
    TargetDetailTableViewCell *cell = (TargetDetailTableViewCell *)[tableView dequeueReusableCellWithIdentifier:TargetCellIdentifier];
if (cell == nil) 
    UINib *nib = [UINib nibWithNibName:@"TargetDetailTableViewCell" bundle:nil];
    [nib instantiateWithOwner:self options:nil];
    cell = self.TargetCell;
    self.TargetCell = nil;

NSUInteger row = [indexPath row];
NSInteger section = [indexPath section];

Target *aTarget = [targetDictionary objectForKey:[NSNumber numberWithInteger:section]];

if (row == 0) 
        UIImage *dot;
        if (aTarget.importance == high) 
            dot = [UIImage imageNamed:@"dot_red.png"];
        
        else 
            dot = [UIImage imageNamed:@"dot_gray.png"];
        
        UIImageView *variantImageView = [[UIImageView alloc] initWithImage:dot];
        cell.DotImageView = variantImageView;
        [variantImageView release];
        return cell;

我在我的单元格中看不到任何图像。我的 UITableViewCell 子类的其他标签确实会显示出来。我错过了 UIImageView 的东西吗?我对它不是很熟悉。谢谢。

【问题讨论】:

cell.DotImageView 它的创建?也许你忘了在 xib 中链接它 当你说:“我的 UITableViewSubclass 中有一个 DotImageView 的属性”它是 UITableViewCell 吗?我认为我们需要在 cellForRowAtIndexPath 方法中查看您的 UITableViewCell 声明。 @Ernesto 我检查了笔尖,它看起来已连接 @TheRonin 是的,我的意思是 UITableViewCell 的子类 你在哪里实例化self.TargetCell ?? 【参考方案1】:

我可以使用它

[cell.DotImageView setImage:dot];

我不确定为什么它与我最初使用的其他方法相比有效。

【讨论】:

它在原版中不起作用,因为当您替换单元格的 imageView 时,您还需要将新的 imageView 添加为单元格的子视图,否则它只是单元格的一个属性,它是实际上不在视图层次结构中。不过老实说,我会坚持后一种方法 - 容易得多。【参考方案2】:

将您的代码更改为

if (row == 0) 
        UIImage *dot;
        if (aTarget.importance == high) 
            dot = [UIImage imageNamed:@"dot_red.png"];
        
        else 
            dot = [UIImage imageNamed:@"dot_gray.png"];
        
        cell.DotImageView.image = dot;
        return cell;

您正在做的是将新的 UIImageView 对象分配给 cell.DotImageView 现在您的 cell.DotImageView 指向这个本地图像视图对象而不是 xib 上的那个对象

【讨论】:

他将单元绑定到视图控制器上名为 TargetCell 的插座,然后将单元加载到该属性中。这是一种有效的方法,并且比 objectAtIndex 版本更安全(例如,如果单元格不是 nib 中的第一个对象怎么办),但我同意,您的方法代码少得多并且工作得一样好大多数情况下。我不认为这就是他的代码不起作用的原因。【参考方案3】:

1 - 基本案例

只需使用标准 UITableViewCell 的 image 属性。它适用于大多数情况。

2 - 您的自定义案例

请注意,您的属性是对您的 imageView 的简单引用。因此更改它的值不会替换子视图树中的初始值。相反,保留你的 imageView 并设置它的 UIImage 属性会更好。

yourImageView.image = aNewImage.

【讨论】:

【参考方案4】:

将方法插入到 TargetDetailTableViewCell 类中:

- (void)setDotImage:(UIImage*)dot



[self.DotImageView setImage:dot];



它对我有用。希望对你有帮助!

【讨论】:

以上是关于在 cellForRowAtIndexPath 的 UITableViewCell 的子类中显示 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

tableView:cellForRowAtIndexPath 的保留计数:

在 cellForRowAtIndexPath 中将 UIButton 视为 UILabel

UIView 在 cellForRowAtIndexPath 中重叠/再次创建

从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?

无法在 cellForRowAtIndexPath 中获取单元格框架或约束

在 cellForRowAtIndexPath 中获取 iOS CoreData 后台线程