iOS - UITableViewCell子类有两个不同的图像

时间:2012-05-28 22:03:03

标签: objective-c ios uitableview subclass

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

这个UITableViewCell子类只有两个图像,具体取决于条件。我在UITableViewCell子类中使用图像之前所做的事情我已经将它们声明为

static UIImage *image = nil; 

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

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

来自imageNamed:UIImage方法的文档,

  

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

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

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

typedef enum {
  ImageTypeOne,
  ImageTypeTwo
} ImageType;

@property (nonatomic) ImageType imageType;

在实现中,将生成的setter覆盖为:

- (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;
}

答案 1 :(得分:0)

  

理想的方法是在init方法中设置它   UITableViewCell但是我不能重复使用这些单元格吗?

这是正确的,但是解决方案不是太远了。对两个静态图像使用相同的技术,并使用imageView等特殊方法更新updateMyCellImage的图像,具体取决于键属性值。

第二步是为key属性准备一个setter,在key属性的值改变之后调用这个方法。

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

答案 2 :(得分:0)

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

如果这是我的话,我会在dataSource中为每个UIImage设置一个属性,该属性仅被实例化一次然后我会通过让dataSource告诉他们要显示什么来正常配置单元格。

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