问题很简单:如何加载自定义UITableViewCell
来自 Xib 文件?这样做可以让您使用 Interface Builder 来设计您的单元。由于内存管理问题,答案显然并不简单。这个线程 https://stackoverflow.com/questions/134575/using-interface-builder-for-uitableviews提到了该问题并提出了解决方案,但处于 NDA 发布之前并且缺少代码。这是一个讨论这个问题但没有提供明确的答案。
这是我使用过的一些代码:
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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)