1

我只是有一个关于 UITableView 中自定义单元格的快速“最佳实践”问题。当我在 if(cell == nil) 块中构建自定义单元格时出现了我的问题

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

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

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

(3) 我还尝试将自定义单元格(标签、图形等)的绘图放置在 (cell == nil) 块内,但在块之后设置 labels.text 属性。这是无法完成的,因为我的 UILabel 无法从它们被实例化的块外部访问。我可以为 (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 {

但我真的看不出这对我有什么帮助:)

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

谢谢!

4

1 回答 1

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 在其示例代码中许多地方的做法(至少我上次查看时他们是这样做的)。

于 2009-11-15T02:52:39.573 回答