0

我将 UITableViewCell 子类化为在最左边有一个图像,然后在中间有一些文本,然后在最右边有一些文本。

这个 UITableViewCell 子类将根据条件只有两个图像。我之前在 UITableViewCell 子类中使用图像时所做的事情,我已将它们声明为

static UIImage *image = nil; 

然后在+(void)initialize我分配给他们的方法中。这样做只是为了拥有图像的类实例,而不是用尽资源将这些图像分配给 UITableViewCell 的每个实例。

所以我现在的问题是,根据我的 UIViewController 中调用该cellForRowAtIndexPath方法的条件,我应该显示带有 imageA 或 imageB 的 UITableViewCell。所以在伪代码中它看起来像这样

if (conditionA) { 
    // Set image of cell to be imageA 
} else { 
    // Set image of cell to be imageB 
}

那么如何使用子类 UITableViewCell 实现这一点呢?我在想一种方法是观察 UITableViewCell 中的一个属性,当该属性发生变化时,我会相应地设置单元格图像,但这对于应该很容易的东西来说似乎有点臃肿?

理想的方法是将它设置在 UITableViewCell 的 init 方法中,但是我将无法重用单元格,对吗?

4

3 回答 3

1

您不必担心会为每个实例创建冗余图像。该类UIImage已经有一个内置缓存,只要您使用imageNamed:选择器创建它们,它就不会创建新的图像实例。

从文档中的imageNamed:方法UIImage

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据,缓存它,然后返回结果对象。

如果这两个图像是预定义的并且不会更改,那么您可以简化子类单元格的界面。只允许这个子类的用户告诉它应该使用哪种类型的图像。你可以使用一个enum

在 UITableViewCell 的子类标头中,创建枚举。使用适合您用例的任何名称。

typedef enum {
  ImageTypeOne,
  ImageTypeTwo
} ImageType;

@property (nonatomic) ImageType imageType;

在实现内部,将生成的设置器覆盖为:

- (void)setImageType:(ImageType)newImageType {
    imageType = newImageType;

    if (imageType == ImageTypeOne) {
        theImageView.image = [UIImage imageNamed:@"one"];
    } 
    else if (imageType == ImageTypeOne) {
        theImageView.image = [UIImage imageNamed:@"two"];
    }
    // this will resize the image view to fit the image.
    [theImageView sizeToFit];
}

在您的cellForRowAtIndexPath:方法中,只需根据条件设置此属性。

if (conditionA) { 
    myCustomCell.imageType = ImageTypeOne;
} else { 
    myCustomCell.imageType = ImageTypeTwo;
}
于 2012-05-28T22:56:02.667 回答
0

理想的方法是将它设置在 UITableViewCell 的 init 方法中,但是我将无法重用单元格,对吗?

这是正确的,但在不远的地方有解决方案。对两个静态图像使用相同的技术,并imageView使用特殊方法更新 's 图像,例如updateMyCellImage取决于键属性值。

第二步是为该键属性准备这样一个设置器,它会在键属性的值更改后调用此方法。

然后,您只需cellForRowAtIndexPath在单元格出列/初始化后设置键属性值,并且imageView将为您更新图像,您将能够重用单元格。

于 2012-05-28T22:11:13.297 回答
0

我不明白使用static UIImage. 视图不应该拥有它的数据。

如果这是我,我将UIImage在 dataSource 中为每个属性设置一个仅实例化一次的属性,然后我只需通过让 dataSource 告诉它们要显示的内容来正常配置单元格。

看起来你为自己做了更多的工作并引入了一个非常严格的结构

于 2012-05-28T22:15:11.113 回答