6

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

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<NSObject 0x10fe7d790> setValue:forUndefinedKey:]:此类与键 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 属性。使用 owner:nil 是因为它在内部使用 NSObject 当然也没有 IBOutlet 属性。

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

例如

- (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 也没有列出错误的连接)。

有没有其他人对这个错误是如何产生的有任何想法?

4

3 回答 3

2

Have you connected the outlets for "messageLabel and statusLabel" in the Cell Nib file? The error states that the IBOutlet property for "statusLabel" is not found in the Nib file (connection issue).

于 2014-01-04T00:23:03.157 回答
2

我必须确保在创建插座时指定我连接到单元格,而不是对象的所有者。当您将连接从单元格中的标签拖到类时,会出现菜单以便您命名它,您必须在“对象”下拉菜单中选择它(您可以选择“文件所有者”或单元格的类名,选择单元格的类名)。当然,您也必须将单元格的类声明为此类,而不仅仅是“TableViewCell”。否则我会继续让课程不符合密钥要求。所以现在我拥有该类的单元格和文件所有者。

于 2019-11-22T19:01:30.900 回答
0

还要检查 MyCell.xib 文件是否(错误地!)被添加到里面

Target Settings -> Build Phases -> Compile Sources

编译源适用于所有 .m 文件,而不适用于 .Xib 资源文件。

Copy Bundle Resources 用于 .Xib 资源文件。

于 2016-07-16T06:23:46.003 回答