我将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方法中设置它,但后来我无法重用这些单元格吗?
答案 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告诉他们要显示什么来正常配置单元格。
看起来你为自己做了更多工作并引入了一个非常严格的结构