如何回收从XIB创建的UITableViewCell对象?

时间:2012-02-05 15:28:54

标签: ios uitableview uikit xib

我想使用XIB创建自定义UITableViewCell,但我不知道如何使用UITableViewController的排队机制来回收它。我怎么能做到这一点?

伙计们,这个问题的目的是按照the FAQ进行自我回答,尽管我喜欢这种令人敬畏的回答。有一些赞成,给自己喝啤酒。我问这个是因为有朋友问我,我想把它放在StackOverflow上。如果你有任何贡献,无论如何!

4 个答案:

答案 0 :(得分:51)

如果您使用的是iOS 5,则可以使用

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
                                           bundle:nil] 
     forCellReuseIdentifier:@"cellIdentifier"];

然后每当你打电话:

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

tableview将加载nib并为你提供一个单元格,或者为你出一个单元格!

nib只需要一个在其中定义的单个tableviewcell的笔尖!

答案 1 :(得分:2)

创建一个空的笔尖并将表格单元格添加为第一个项目。在检查器中,您可以在Interface Builder中添加reuseIdentifier字符串。

要在代码中使用单元格,请执行以下操作:

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (cell == nil)
    {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0];
    }

    //set up cell

    return cell;
}

还有另一种方法可以为您的单元格创建一个插座,并使用控制器作为文件的所有者加载单元格笔尖,但老实说这更容易。

如果您希望能够访问已添加到笔尖中的单元格的子视图,请为其添加唯一标记,并使用[cell viewWithTag:x];

访问它们

如果您希望能够在单元格上设置自定义属性,则需要创建自定义UITableViewCell子类,然后在InterfaceBuilder中将其设置为nib的类,并在您使用时将UITableViewCell转换为自定义子类在上面的代码中将其出列。

答案 2 :(得分:2)

要使用XIB设置自定义UITableViewCell,您必须执行以下操作:

  • 在标题中设置IBOutlet
  • 在Interface Builder
  • 中配置表格视图单元格
  • 将XIB加载到tableView:cellForRowAtIndexPath:
  • 像任何其他单元格一样配置

所以......让我们在头文件中设置一个IBOutlet。

@property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell;

不要忘记在实现文件中合成它。

@synthesize dvarTorahCell;

现在,让我们创建并配置单元格。您需要注意Cell Identifier和IBOutlet,如下所示:

enter image description here

现在在代码中,您将XIB加载到您的单元格中,如下所示:

enter image description here

请注意,Interface Builder中的Cell Identifier与下面代码中显示的一致。

然后你继续像其他任何一样配置你的细胞。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {

    [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil];
    cell = dvarTorahCell;
    dvarTorahCell = nil;
}

//configure your cell here.

请注意,在访问子视图(例如标签)时,您现在需要按标记引用它们,而不是通过textLabeldetailTextLabel等属性名称引用它们。

答案 3 :(得分:1)

在这里你可以这样做:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
  if (!cell)
  {
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
    cell = [topLevelItems objectAtIndex:0];
  }

  return cell;
}

.h中的cellLoader定义如下:

UINib *cellLoader;

和.m的实现如下(例如在初始化期间):

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain];

CellClassName是.m中定义的如下(也是你的xib的名称)。

static NSString *CellClassName = @"YourCustomeCell";

不要忘记在xib创建的单元格中使用字符串CellClassName

有关详细信息,我建议您阅读这篇精彩的教程creating-a-custom-uitableviewcell-in-ios-4

希望它有所帮助。

P.S。我建议你使用UINib,因为它是一种加载xib文件的优化方法。