16

我将如何使用 UINibs 实例化和使用 UITableViewCell 作为 iOS5.0 中的 tableview。我知道 iOS5.0 中有一个 registerNib:forCellReuseIdentifier: 也需要使用,但不知道如何使用

提前感谢您对此的任何帮助

4

2 回答 2

42
  1. 使用 UITableViewCell 作为顶级对象创建您的 xib 文件。这称为 Cell.xib
  2. 根据这个文件创建一个 UINib 对象
  3. 将 UINib 注册到表视图(通常在表视图控制器子类的 viewDidLoad 中)。

步骤 2 和 3 可以组合使用,因此您可以在 viewDidLoad 中使用以下行:

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

然后,在 cellForRowAtIndexPath 中,如果您想要 nib 中的一个单元格,则将其出列:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

这要么从 nib 创建一个新实例,要么使现有单元出队。

于 2012-05-10T12:24:41.293 回答
1

@jrturtons 的答案是正确的,但不幸的是,iOS 5(在 iOS 6 中已修复)与 VoiceOver 一起存在一个错误:rdar://11549999。以下类别UITableView解决了该问题。只需使用-fixedDequeueReusableCellWithIdentifier:而不是正常的dequeueReusableCellWithIdentifier:. 当然,NIB 必须使用

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

之前(在-viewDidLoad)。

UITableView+Workaround.m:

@implementation UITableView (Workaround)
- (id)fixedDequeueReusableCellWithIdentifier:(NSString *)identifier {
    id cell = [self dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        // fix for rdar://11549999 (registerNib… fails on iOS 5 if VoiceOver is enabled)
        cell = [[[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil] objectAtIndex:0];
    }
    return cell;
}
@end
于 2012-12-14T15:40:14.257 回答