以下是 UITableViewDataSource 协议的 CellForRowAtIndexPath 方法。我在网站上看到了这段代码。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *TableIdentifier = @"SimpleTableItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:TableIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TableIdentifier];
}
cell.textLabel.text = [playersReady objectAtIndex:indexPath.row];
return cell;
}
我的问题是:
为什么在这里定义cell
写= [tableView dequeueReusableCellWithIdentifier:TableIdentifier];
?那意味着什么?如果我评论说代码一切正常。 代码是什么?嗯...
如果cell
等于if
,那么nil
语句中的cell
如何等于TableIdentifier
( SimpleTableItem )? 编写代码的内容是什么?
为什么TableIdentifier
等于 SimpleTableItem ? 为了什么?
答案 0 :(得分:2)
iPhone没有大量内存。但即使在现代计算机上,您也不希望为表中的每个单元初始化一个新单元格。那只是在浪费记忆力。因此,Apple提出了可重复使用的细胞的想法。您只需初始化一些填充屏幕的单元格(表格视图)。然后,当用户向下滚动时,一些新单元格将出现在屏幕的底部,但同时其他单元格将在屏幕顶部消失。因此,您可以简单地使用这些单元格并重复使用它们。
幸运的是,UITableView为您管理这个。当您需要在该方法中设置新单元格时,您需要做的就是询问表格视图,如果它有任何可用的单元格可以重复使用。如果有可重用的单元格,则dequeueReusableCellWithIdentifier:将返回其中一个。但是如果还有不可用的(通常是当你第一次用初始单元格填充表视图时),它将返回nil。所以你必须测试cell是否为nil,如果是这样的话,从头开始创建一个新的单元格。
在iOS 6.0上有一个新方法dequeueReusableCellWithIdentifier:forIndexPath:
,它总是返回一个有效的单元格(如果还没有可重用的单元格,它会为你创建单元格)。
答案 1 :(得分:1)
表视图仅创建可在屏幕上一次显示的单元格。此系统重复使用单元格以保存内存。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 20;
}
-(UITableViewCell *)tableView:(UITableView *)tableViewL cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableViewL dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
NSLog(@"Cell == nil so create a new cell....");
}else {
NSLog(@"Reuse Cell ");
}
return cell;
}
CellIdentifier用于识别单元格,例如,如果你在12个单元格的前10个表格上添加标签,你添加了一个按钮,当你重复使用cell时会给你一个问题。所以我们需要创建一个不同的单元格用于在单元格上添加按钮并给出它是一个标识符字符串。