为啥我们使用 cellIdentifier?

Posted

技术标签:

【中文标题】为啥我们使用 cellIdentifier?【英文标题】:Why we use the cellIdentifier?为什么我们使用 cellIdentifier? 【发布时间】:2011-12-08 07:47:06 【问题描述】:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier  ];
    if(cell == nil)
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    
    cell.text = [[views objectAtIndex:indexPath.row] objectForKey:@"title"];
    return cell;

为什么我们在这里使用 CellIdentifier,为什么它是静态的?

【问题讨论】:

【参考方案1】:

这个想法是表格视图在使用后不一定会破坏单元格,但可以回收它以提高性能。该标识符用于获取正确的缓存单元格,而不是另一个表视图。例如,如果您一直需要两种不同的单元格类型,您甚至可以为同一个表格视图使用多个标识符。

想象有一个由标签和图像视图组成的单元格。初始化单元格时,需要创建单元格视图,需要创建标签,需要创建图像视图。现在该类型的每个单元格看起来都一样,它们只是内容不同。因此,有时会返回一个未使用的单元格,而不是每次都重新进行此设置,而您只需填写新内容。

【讨论】:

在哪种情况下这个 if 单元格将为 nil if(cell == nil) cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 您先致电[tableView dequeueReusableCellWithIdentifier:CellIdentifier];。如果 table view 仍然有一个未使用的单元格,它可以给你,你需要做的就是配置它。但如果它没有一个(例如因为表格要求您第一次生成一个单元格),那么您需要创建它。【参考方案2】:

静态变量将只构造一次,并且在调用 cellforrowatindexpath 方法时始终避免创建内存。它的生命周期将存在于该文件中,因为它是局部变量,而对于全局静态,它的生命周期将存在于整个文件中应用程序

【讨论】:

【参考方案3】:

CellIdentifier 是一种标记tableViewCells 的方法。这样uitableView 可以知道在需要重用时取出哪个uitableviewcell

【讨论】:

【参考方案4】:

previous question 已经解释了细胞回收。静态变量对于特定的 .m 文件是“全局的”,它们在类的所有实例之间共享。这是有道理的,因为这个字符串只是一个标识符——为类的每个实例使用相同字符串的单独实例将是一种浪费。

【讨论】:

【参考方案5】:

当您尝试通过出列来重用一个单元格时,您可以使用一个单元格标识符(如标签)来标识该单元格。

它是静态的,因为这样你只定义一次,但它在该方法内的类的所有对象之间共享。

【讨论】:

以上是关于为啥我们使用 cellIdentifier?的主要内容,如果未能解决你的问题,请参考以下文章

cocos code ide为啥不更新了

为啥我在 IDE 中有另一个尺寸的组件?

为啥从命令行编译而不是从 IDE 编译时会出现歧义错误?

为啥在 Robot Framework IDE (RIDE) 中使用 pymssql 连接到 db 时出现错误?

用mplab ide调试c时为啥左侧不见绿色箭头,如何才能弄出来

为啥这个智能合约功能在使用 web3 提供程序的 Remix IDE 上不起作用?