ios - 如何从 Xib 文件加载自定义 UITableViewCells?

标签 ios uitableview object cocoa-touch xib

问题很简单:如何从 Xib 文件加载自定义 UITableViewCell?这样做允许您使用 Interface Builder 来设计您的单元格。由于内存管理问题,答案显然并不简单。 This thread提到了这个问题并提出了解决方案,但它是 NDA 发布前的版本并且缺少代码。这是一个 long thread在没有提供明确答案的情况下讨论该问题。

这是我用过的一些代码:

static NSString *CellIdentifier = @"MyCellIdentifier";

MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = (MyCell *)[nib objectAtIndex:0];
}

要使用此代码,请创建 MyCell.m/.h,它是 UITableViewCell 的新子类,并为您想要的组件添加 IBOutlets。然后创建一个新的“空 XIB”文件。在 IB 中打开 Xib 文件,添加一个 UITableViewCell 对象,将其标识符设置为“MyCellIdentifier”,并将其类设置为 MyCell 并添加您的组件。最后,将 IBOutlets 连接到组件。请注意,我们没有在 IB 中设置文件的所有者。

如果 Xib 不是通过额外的工厂类加载,其他方法提倡设置文件所有者并警告内存泄漏。我在 Instruments/Leaks 下测试了上面的内容,没有看到内存泄漏。

那么从 Xibs 加载单元格的规范方法是什么?我们设置文件的所有者吗?我们需要工厂吗?如果是这样,工厂的代码是什么样的?如果有多种解决方案,让我们阐明每个解决方案的优缺点...

最佳答案

正确的解决方案是这样的:

- (void)viewDidLoad
{
    [super viewDidLoad];
    UINib *nib = [UINib nibWithNibName:@"ItemCell" bundle:nil];
    [[self tableView] registerNib:nib forCellReuseIdentifier:@"ItemCell"];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Create an instance of ItemCell
    PointsItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ItemCell"];

    return cell;
}

关于ios - 如何从 Xib 文件加载自定义 UITableViewCells?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540345/

相关文章:

python - 对象与引用

python - 关于 numpy 沿轴应用和列表理解的困惑

iPhone SDK - 避免转换委托(delegate)类

ios - 可以在网站上使用 "San francisco"字体吗?自由的?

iOS:禁止 "Open in..."菜单并立即在特定应用程序中打开附加的电子邮件文件

ios - 如何从自定义单元格中删除 TableView 行?

ios - 启用点击隐藏后,导航 Controller 的工具栏没有被隐藏?

ios - cellForRowAtIndexPath 和 heightForRowAtIndexPath 之间有什么关系

ios - 在 tableview Swift 3 中保存并显示录制的语音笔记

javascript - 数组嵌套循环无法按预期工作