Xcode 5,Dynamic Prototype的自定义UITableViewCell类

时间:2013-10-19 20:57:57

标签: ios objective-c xcode interface-builder

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

我创建了一个故事板并删除了一个UITableView,其中包含一个原型动态单元格。我已将单元格的类设置为ItemCell,并将重用标识符设置为ItemCell

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

在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。从我读过的所有内容来看,这应该是有效的。我找不到任何表明我需要以不同的方式在故事板中注册该类的东西,但很明显,单元格并不知道它有与之相关的故事板。

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

1 个答案:

答案 0 :(得分:8)

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