什么是单元格标识符,有什么用?

3
我想知道为什么在UITableView中需要一个单元格标识符(Cell Identifier)...就像这样:

static NSString *cellIdentifier = @"Cell";

这有什么用?举个例子吗?
3个回答

8

UITableView需要能够流畅快速地显示快速变化的数据,有时候单元格本身还有额外的代码来构建单元格,使用Core Graphics或类似的技术。

UITableView一次只能显示少量单元格,而数据源中可能包含更多“行”。为了减少处理和内存使用,苹果提供了dequeueReusableCellWithIdentifier方法。如果可用,这使得tableview可以重复使用已经实例化的已经从视图中删除的单元格。

UITableView可以包含不同类型的单元格。例如,您可能有一个tableview,其中某些行具有相关联的图像,而其他行则没有,并且具有不同的单元格布局。或者根据某些上游应用程序设置,您有不同的单元格类型。CellIdentifier告诉dequeue方法您要重用哪种类型的单元格,以便您不会收到错误类型的单元格。

static NSString *CellIdentifier = @"Cell with image";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];

如果找不到可重用的单元格,则必须创建新的单元格,即:

if(cell == nil) ....

混淆是因为许多应用程序只为给定的表视图使用单个类型的单元格,因此CellIdentifier不会更改。
苹果公司有一篇很好的写作: https://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html 另请参见: 在同一个表视图中使用两种不同的单元格标识符 和: http://www.digitalhobbit.com/2009/12/19/a-useful-uitableview-cell-creation-pattern/

这是一个非常棒的答案 - 给了我所有我想要的东西! - Max Song

3

它被用作单元格缓存的键,例如:

- (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString * CellIdentifier    = @"MyCell1";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
   ...

然后,另一个表可能会使用不同的标识符...

1

如果您需要重复使用单元格以节省应用程序内存,那么单元格标识符是很好的选择。例如,如果您的应用程序中有许多单元格,而不是在用户滚动过去后释放单元格,只需修改单元格以包含您正在创建的新单元格的信息即可。这样可以节省空间,因为如果用户一次只查看10个单元格,则无需分配数千个单元格。标识符是系统用来检查是否已经存在具有该标识符的单元格的东西。如果有,它们就会被使用。否则,必须分配新空间并创建新对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接