如何使用UINib实例化和使用自定义UITableViewCells

时间:2012-05-10 04:07:20

标签: ios iphone uitableview cocoa-touch uikit

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

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

2 个答案:

答案 0 :(得分:42)

  1. 使用UITableViewCell作为顶级对象创建xib文件。这称为Cell.xib
  2. 基于此文件创建UINib对象
  3. 使用表视图注册UINib(通常在表视图控制器子类的viewDidLoad中)。
  4. 可以组合步骤2和3,因此您可以在viewDidLoad中使用以下行:

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

    然后,在cellForRowAtIndexPath中,如果你想要一个来自笔尖的单元格,你可以将它出列:

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

    这将从nib创建一个新实例,或者使现有单元格出列。

答案 1 :(得分:1)

@jrturtons的回答是正确的,但遗憾的是iOS 5(在iOS 6中已修复)与VoiceOver一起出现了一个错误:rdar://11549999UITableView上的以下类别解决了该问题。只需使用-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