为什么我的UITableView尝试加载时出现无法出队的错误?

时间:2013-04-02 20:00:35

标签: ios objective-c uitableview

我收到以下错误:

  

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'无法将单元格出列   使用标识符FontCell - 必须注册一个nib或类   标识符或连接故事板'

中的原型单元格

我不确定我做错了什么。我设置了单元格标识符(以编程方式,因为它不是通过Interface Builder创建的)并执行我认为我应该在委托方法中执行的所有操作,但是当我尝试加载UITableView时,我仍然会收到该错误。 / p>

以下是相关代码(值得注意的是我已经将UITableViewCell子类化为自定义选项):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.fonts.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"FontCell";

    FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    if (!cell) {
        cell = [[FontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FontCell"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    int row = indexPath.row;

    cell.fontFamilyLabel.text = self.fonts[row];

    return cell;
}

这是我在子类UITableViewCell(FontCell)中更改的唯一方法:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.fontFamilyLabel = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 200, 20)];
        self.fontFamilyLabel.textAlignment = NSTextAlignmentCenter;

        [self.contentView addSubview:self.fontFamilyLabel];
    }
    return self;
}

我究竟做错了什么?

4 个答案:

答案 0 :(得分:28)

最简单的解决方法是将其更改为FontCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];与当前代码一样,如果您执行此方法,则必须检查以确保cell不是nil


或者,您可以在与UINib

关联的表级注册Class@"FontCell"

例如(在viewDidLoad中):

[self.tableView registerClass: [FontCell class] forCellReuseIdentifier:@"FontCell"];

然后你可以做

FontCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FontCell" forIndexPath:indexPath];

这种方法的好处在于你知道你的单元格永远不会是nil,所以你可以立即开始修改它。

答案 1 :(得分:4)

您正在使用dequeueReusableCellWithIdentifier:forIndexPath:方法。该方法的文档说明了这一点:

You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.

所以这里

[self.tableView registerClass: [FontCell class] forReuseIdentifier: @"FontCell"];

答案 2 :(得分:2)

我也有这样的问题,我找到的解决方案是:

转到Project Navigator并选择“ViewController.h”。附加

 <UITableViewDelegate, UITableViewDataSource>
在“UIViewController”之后。

答案 3 :(得分:1)

如果像我一样使用tableview(不是表视图控制器),则默认情况下不会出现单元格。

在故事板中选择tableview 打开“属性”检查器 将原型单元格从0更改为1 选择新显示的表格单元格 在Attributes检查器中,将Identitifier设置为&#34; FontCell&#34;