在哪里放置自定义UITableViewCell的更新逻辑? (苹果手机)

时间:2009-11-15 01:09:15

标签: iphone uitableview uilabel

我只是在UITableView中有关于自定义单元格的快速“最佳实践”问题。 当我在

中的if(cell == nil)块中构建自定义单元格时,我的问题出现了
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

(1)如果我构建标签并在(cell == nil)块内设置它们的text属性;只有屏幕上可见的单元格才能在其中显示正确的文本,其余的将被重复使用。

(2)好的,所以我尝试在块外面移动自定义单元格的构建。这当然会导致我的单元格在每次用户滚动时反复重绘...并且彼此重叠。

(3)我还尝试将自定义单元格(标签,图形等)的绘图放在(cell == nil)块中,但在块之后设置labels.text属性。这不能做我的  然后无法从实例化的块外部访问UILabels。我可以为(UILabel * l in cell.contentView.subviews)做一些疯狂但是这需要为每个标签使用if语句,并且可能需要一些标签来识别它们用。

(4)然后,我可以在(cell == nil)块之前声明所有标签,然后在块内部进行实例化和绘制,并在(cell == nil)块之后设置text属性。但是当我通过10个UIlabels时,它看起来和感觉非常混乱,让它们在(cell == nil)块的内部和外部展开,而且每次表必须“刷新”时都会声明它们。

我问的原因是因为当使用2-4个标签时,我总是找到一种方法,但这次我需要设置12个自定义UILabel,我想这样做,所以我必须重绘最少量图形,因为可能会有很多细胞。

我见过人们和Apple文档使用的例子:

- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {

但我真的不明白这会对我有什么帮助:)。

希望有人能指出这类事情的“最佳实践”。

谢谢!

1 个答案:

答案 0 :(得分:3)

你的选择3是要走的路。每当需要新单元格时(即在if (cell == nil)块中)创建包含其所有子视图的单元格,并在块之后设置标签的内容。

如果您使用自定义UITableViewCell子类,则可以为每个标签声明一个属性,然后使用块外的cell.myLabelX访问它们。如果没有,我会使用tag属性建立连接。在创建单元格时,为每个标签指定唯一标记:

UILabel *label1 = [[UILabel alloc] initWithFrame:...];
label1.tag = MYLABEL1TAG;
[cell addSubview:label1];
...

在块之外,通过标签检索标签:

UILabel *label1 = (UILabel *)[cell viewWithTag:MYLABEL1TAG];
label.text = ...

这也是Apple在他们的示例代码中在许多地方做到的方式(至少在我上次查看的时候是这样做的。)