2012-03-11 41 views
0

我有一个UITableView,其中每个单元格在内容中都是唯一的,但是用于目的并且不确定如何制作单元格。看到下面的图片。
Example Image
黑框的轮廓代表表格,它是按行分开的。每行有一个可变的高度,并包含不同数据的可视表示。
我有大约50行,每行包含约10个绿色/蓝色线,其中存在2UIViews和UILabel。我不需要编辑或删除。数据约为JSON的±30kB,我将其转换为强类型对象。当UITableView中的每个单元格都是唯一的时该怎么办?


到目前为止,我已经确定了以下方法:

  1. 没有出列,节约一度与它的correspondending数据构建每个单元格。
  2. 不出队,不保存单元格,而是从数据中完全启动并重建视觉表示。

    出队总是更好。

  3. 的出列通过唯一标识符的单元格,否则构造它
    • 可以使用这个唯一标识符来完成或将我必须实现我自己?
  4. 离开细胞并从数据中完全重建视觉表示。

我很好不会立即滚动时出现在TableCell的可视化表示,这将是罚款,以构建一个工作线程细胞,然后每个小区在建造时添加单元格的内容。

哪种方法最适合,并认为可以接受?或者为什么另一种方法会更好?

+0

细胞从来没有在tableview中重建,他们被重用,只是将这些数据发送到可重用的单元格,但是你从Web服务中获取这些数据?工作线程是否需要等待数据的网络调用存储在设备上? – doNotCheckMyBlog 2012-03-11 00:41:33

+0

我最大的问题之一就是实际数据。在我看来,这是丑陋的JSON:每个绿线是一个数组中的单独元素,它与实际行分离。它们也完全无序,因此一行的高度是未知的,直到所有的数据都可用。我正在从web服务下载数据。 – Xeago 2012-03-11 10:52:40

回答

3

如果行数是

  1. 固定
  2. 行数非常小的(明智的内存占用)

每行相当无关,快捷方式™将预先初始化所有细胞并根据需要返回它们:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [myCells objectAtIndex:indexPath.row]; 
} 

但是,如果有sl很可能你的单元格不能一次全部放入内存中(记住所有的背景材料也可以增加到总共可用的22-25MB堆空间),你仍然应该考虑采用稍微冗长的方式并且懒惰地创建单元格当他们第一次被访问时,然后缓存结果。好消息是,UITableView已经为你准备好了,只需按照预期使用单元格标识符即可。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    NSString *identifier = [NSString stringWithFormat:@"MyCell%d", indexPath.row]; 
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) { 
     cell = [[MyTableViewCell alloc] initWithCellIdentifier:identifier]; 
     [cell autorelease]; // if non-ARC 
    } 
    return cell; 
} 

我不推荐使用rocir建议的零标识符。通过提供nil的单元标识符,可以防止UTTableViewController为您缓存单元(documentation)。这会在您的单元格滚动出可视区域并在稍后用户再次滚动时再次可见时产生额外开销。在这种情况下,单元格可能仍然存在,但在调用tableView:cellForRowAtIndexPath:时无法访问它。

+0

我正在做这个方法。如果我进入性能问题的话,我将直接绘制到单元格的表面上,将单元格的控件保存在数据源(yuck)中,或者异步地构建单元格的内容(例如,创建一个nsoperation的分支以创建必要的视图,然后调用'[cell setNeedsLayout];')如果我成功,或者没有提供其他可接受的答案,将标记为答案。谢谢 – Xeago 2012-03-13 00:33:32

1

有时候重用单元格可能会给我们一些问题,当每一个都是唯一的。这取决于案件,我不知道你是如何实现这一点。我所做的没有导致任何性能问题,每次都在标识符中构造零并构造单元。

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

只是为了确保,这可能会导致性能问题,这取决于你如何让你的细胞。但为了简单的目的,它应该起作用。

+0

不使用nil作为比唯一标识符更差的标识符吗?或者传递nil停止tableview保持单元格在内存中?如果我能通过一个独特的,我可能有机会有时它会是正确的单元格,对吗? @rocir提到的方法将是第二个。我需要为显示的每一行构造带有文本的水平彩色线条,让我们调用该视图'EventView'。为了让EventView知道它的起点和宽度,我必须将2个日期转换为浮点值,表示视图的x坐标。 我很好,在另一个线程上排队。 – Xeago 2012-03-11 11:14:45

相关问题