2009-11-15 73 views
1

我只是有一个关于UITableView中的自定义单元的快速“最佳实践”问题。 我的问题出现时,我有建立在如果(细胞==零)块中的自定义单元格在何处放置自定义UITableViewCell的更新逻辑? (iPhone)

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

(1)如果我建立标签,并设置这些文本属性的(细胞内==无)块;只有屏幕上可见的单元格才会有正确的文本,其余的只会被重用。

(2)好的,所以我尝试移动块外的自定义单元的构建。这当然会导致我的单元格在每次用户滚动时......一次又一次地重新绘制。 (3)我也尝试将自定义单元格(标签,图形等)的绘图放置在(cell == nil)块内,但在块后面设置labels.text属性。这是不可能的,因为我的 UILabels然后不能从它们被实例化的块之外访问。我可以做一些疯狂的(在cell.contentView.subviews中的UILabel * l),但是这需要if语句每个标签和可能一些标签来标识它们。 (4)然后,我可以在(cell == nil)块之前声明我的所有标签,然后在块内实例化和绘图,并在(cell == nil)块之后设置文本属性。但是当我通过10个UI标签时,这看起来感觉非常混乱,让它们像这样在(cell == nil)块内部和外部展开,并且每次表格必须“刷新”时都会声明它们。

我问的原因是因为当使用2-4个标签时,我总是找到一种解决方法,但是这次我需要12个自定义UILabels设置,并且我想这样做以便我必须重绘至少图形的数量,因为可能会有很多单元格。

我所看到的例子,人们和苹果的文档使用:

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

但我实在看不出如何能帮助我了:)

希望有人能够指出一个“最佳实践“。

谢谢!

回答

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 = ... 

这也是苹果公司是如何做的在他们的样本在很多地方代码(至少这是他们在上次查看时的做法)。

+0

谢谢你Ole :) 这对我的编号3 :)是一个转折点,但它增加了对代码的非常好的可读性。我不知道viewWithTag,我认为唯一的方法是循环浏览视图并使用switch或if语句来标识标签。 也许这就是为什么我没有看到它在苹果代码:) 再次感谢你。 – RickiG 2009-11-15 05:25:32

+1

在不牺牲可读性的前提下,可以这样做: ((UILabel *)[cell viewWithTag:TRIP_LABEL])。text = @“我到哥本哈根的旅程”; – RickiG 2009-11-16 00:16:32

+0

我知道这是很久以前,但只是感谢你的答案。解决了一个问题,我烦恼了我的垃圾。 – Rudiger 2010-08-13 02:36:36