从xib加载UITableViewCell(此类不是密钥值编码兼容的密钥)

时间:2014-01-03 22:45:24

标签: ios uitableview xib uinib

我很好奇使用xib文件来布局UITableViewCell的内容的正确方法。当我尝试按照我在互联网上找到的所有步骤时,我总是得到

  

由于未捕获的异常'NSUnknownKeyException'而终止应用,   原因:'[< NSObject 0x10fe7d790> setValue:forUndefinedKey:]:this   class不是密钥值编码兼容的key statusLabel。'

所以这是相关的代码

@interface MyCell : UITableViewCell

@property (nonatomic,strong) IBOutlet UILabel* messageLabel;
@property (nonatomic,strong) IBOutlet UILabel* statusLabel;

在我的UIViewController中,我尝试了两种

-(void)viewDidLoad {
     [self.tableView registerNib:[UINib nibWithNibName:@"MyCell"
                                           bundle:[NSBundle mainBundle]]
     forCellReuseIdentifier:@"CustomCellReuseID"];
}

或使用

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"CustomCellReuseID";
    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if ( !cell ) {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil] 
lastObject];
        // or sometimes owner is nil e.g.
        //cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil] 
lastObject];
    }

    // ... remainder of cell setup

    return cell;
}

这两种方法都失败了,我在标题中提到了例外。似乎与owner:self错误是因为UIViewController没有IBOutlet属性。拥有者:nil是因为它内部使用的是NSObject,当然也没有IBOutlet属性。

我发现的唯一工作如下。在我的单元格的init方法中,我将返回的视图/单元格添加到我的初始化单元格

e.g。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // nil out properties

        [self.contentView addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil] lastObject]];
    }
    return self;
}

这看起来真的很好(虽然我也可以将xib中的基本类型改为UIView而不是MyCell或UITableViewCell),这让它感觉不那么好了。

我看过很多帖子,人们遇到这个特殊的错误。这通常被解释为xib本身的布线问题,但是如果我删除了xib中的所有连接,它会很好地加载,但是当我在ui元素和文件所有者之间添加连接时,错误会返回,所以我不要认为它与“清理”xib有任何关系(即使查看xib的XML,也没有列出错误的连接)。

是否有其他人对此错误的发生有任何想法?

3 个答案:

答案 0 :(得分:1)

您是否在Cell Nib文件中连接了“messageLabel和statusLabel”的插座?该错误表明在Nib文件中找不到“statusLabel”的IBOutlet属性(连接问题)。

答案 1 :(得分:0)

同时检查MyCell.xib文件是否(错误!)添加到

Target Settings -> Build Phases -> Compile Sources

编译源是针对所有.m文件而不是针对.Xib资源文件。

并且

复制捆绑资源用于.Xib资源文件。

答案 2 :(得分:0)

我必须确保在创建出口时指定我要钩住单元,而不是对象的所有者。当您将连接从单元格中的标签拖到班级时,会显示菜单,以便您可以对其进行命名,并且必须在“对象”下拉菜单中进行选择(您可以选择“文件所有者”或单元格的班级名称,选择单元格的类名称)。当然,您也必须将单元格的类声明为此类,而不仅仅是“ TableViewCell”。否则,我将继续使该类不符合密钥要求。所以现在我有了该类的单元格和文件所有者。