问题很简单:如何从 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/