0

我正在使用 Xcode 5,并希望使用 Apple 推荐的最佳实践,其中包括动态原型单元和使用registerClass:forCellReuseIdentifier.

我创建了一个故事板并在其上放置了一个UITableView带有 1 个原型的动态单元格。我已将单元格的类设置为ItemCell,并将重用标识符设置为ItemCell

ItemCell 类包含一个nameLabelIBOutlet,我通过拖动将其连接到原型单元格内的标签。

在 ViewController 中,我注册了ItemCell要用于ItemCell重用标识符的类:

- (void)viewDidLoad {
    [super viewDidLoad];

    [_tableView registerClass:[ItemCell class] forCellReuseIdentifier:@"ItemCell"];
}

在 tableView:cellForRowAtIndexPath 中,我将单元格出列并设置 nameLabel 的属性。self.items 是一个 NSArray 字符串。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        ItemCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ItemCell" forIndexPath:indexPath];
        cell.nameLabel.text = [self.items objectAtIndex:indexPath.row];

        return cell;
}

所以:它被创建为一个 ItemCell,但它没有从情节提要中加载它。我已经通过覆盖 initWithStyle:reuseIdentifier 和 initWithCoder 来确认这一点,看看哪个被调用:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code
        NSLog(@"NOT STORYBOARD");
    }
    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code
        NSLog(@"Yay, it's working!");
    }
    return self;

}

每次,它initWithStyle都会被调用。从我读过的所有内容来看,这应该是可行的。我找不到任何表明我需要在故事板中以不同方式注册该类的任何内容,但显然该单元不知道它有一个与之关联的故事板。

我确定我犯了一个完全的新手错误,但我无法弄清楚。任何帮助,将不胜感激。

4

1 回答 1

8

您不必(也不应该)调用registerClass故事板中定义的原型单元。initWithCoder如果必须从情节提要中实例化原型单元,则会自动调用。

于 2013-10-19T21:05:37.603 回答