让我说我有
- (UITableViewCell*)tableView:(UITableView*) cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *cellID = @"Cell Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
else
{
return cell;
}
UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
nameLabel.text = name;
[nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
[nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
[nameLabel setBackgroundColor: [UIColor clearColor]];
nameLabel.textAlignment = NSTextAlignmentCenter;
[cell addSubview: nameLabel];
}
这是怎么回事?
如果单元格不是nil,并且假设您在第5行,它是否会返回第5行的单元格以及确切的文本标签等?
基本上,我的问题是,如果您的自定义单元格包含标签,图片视图等。您如何将cellForRowAtIndexPath
与dequeueReusableCellWithIdentifier
一起使用?
答案 0 :(得分:3)
您尝试将单元格出列。如果尝试失败(单元格为nil),则创建一个单元格并将其配置为视图(而不是视图中的数据)。然后,使用任何更改单元格到单元格的数据或设置填充视图。此外,您应该将任何自定义视图添加到单元格的contentView
,而不是单元格本身。
#define NAME_LABEL_TAG 1234
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellID = @"Cell Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
nameLabel.tag = NAME_LABEL_TAG;
[nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
[nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
[nameLabel setBackgroundColor: [UIColor clearColor]];
nameLabel.textAlignment = NSTextAlignmentCenter;
[cell.contentView addSubview: nameLabel];
}
// Populate views with data and retrieve data for "name" variable
UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:NAME_LABEL_TAG];
nameLabel.text = name;
// Return fully configured and populated cell
return cell;
}
如果您有一个复杂的单元格,通常更容易在Interface Builder和子类UITableViewCell中创建它,这样您就可以拥有引用标签,按钮等的自定义属性。
答案 1 :(得分:0)
是的,将已经添加了这些标签的单元格出列仍将具有它们及其文本,就像您在创建该特定单元格时一样。
创建一个UITableViewCell子类,让我们称之为MyTableViewCell,它具有保存标签/ imageViews / etc所需的属性。一旦你出局或分配了一个你的MyTableViewCell的init,你就可以在这些属性上设置text / images / etc。像这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"identifier";
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[MyTableViewCell alloc] initWithStyle:UITableViewStylePlain reuseIdentifier:CellIdentifier];
}
cell.nameLabel.text = name;
cell.imageView.image = anImage;
return cell;
}
您的方法的一个主要问题是围绕出列和创建的条件。在您的方法中,您只在标记为“初始化”时将标记设置为单元格(您可以立即返回出列单元格而不对其进行格式化)。但是,您希望对已出列和手动实例化的单元格进行此设置。注意在我的方法中如何发生这种情况,return语句位于最底层。这将确保创建和重用的单元格都具有适当的数据。
编辑:我遗漏了一件重要的事情,您将在其initWithStyle: reuseIdentifier:
方法中实例化您的单元格的属性,并将它们作为子视图添加到单元格中。当您在cellForRowAtIndexPath
方法中设置标签(或其他)的文本时,就已经创建了它。基本上,单元格管理创建自己的视图,而UITableView委托只需要担心用数据填充这些视图。
答案 2 :(得分:0)
UITableView首先会询问您预期的细胞数量。然后加载通过 - tableView:cellForRowAtIndexPath:将显示的方法单元格+一些以平滑滚动,更多的对象不会创建。存储在表视图中的创建对象(按用户),您可以通过dequeueReusableCellWithIdentifier:方法访问未使用的对象。 TableView要求用户在滚动时修改当前创建的单元格。如果这里是自由对象 - 从dequeueReusableCellWithIdentifier获取它:另一个 - 创建一个新对象。
答案 3 :(得分:0)
为了不必分配每个表格单元格,表格只分配所需的内容。如果页面上只有8个单元格,那么表格视图将只分配8个单元格或9个我不记得它是否有填充。滚动表视图并且单元格离开页面时,单元格排队等待重新使用,而不是重新分配新单元格,表格视图采用现有单元格,此过程称为出列。当你创建/分配你的单元格时,你给它一个标识符,这个标识符用于检索用该字符串标记的单元格。
答案 4 :(得分:0)
您可以使用此
- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath
iOS 6之后可以使用
或者您也可以在ViewDidLoad中的某个地方注册您的类并使用ResuseIdentifier,因此您不必在CellForRowAtIndexpath中编写ResuseIdentifier部分
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier NS_AVAILABLE_IOS(6_0)
希望这可以帮助你...