【问题标题】:Loading UITableViewCell from a xib (this class is not key value coding-compliant for the key)从 xib 加载 UITableViewCell (此类与键的键值编码不兼容)
【发布时间】:2014-01-21 17:44:12
【问题描述】:

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

由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[ 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 也没有列出错误的连接)。

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

【问题讨论】:

  • 您是否将 Nib 文件中单元格的“自定义类”设置为“我的类”?

标签: ios uitableview xib uinib


【解决方案1】:

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

【讨论】:

  • 它与它的 FileOwner 正确连接。错误是说它无法在 NSObject 上找到 statusLabel (或者在 MYViewController 上,如果我将该控制器作为自己传递给 loadNibNamed:owner:
  • 对于从连接到 FileOwner 的 NIB 加载视图不起作用,除非视图是 UIViewController 层次结构的一部分。您需要将 NIB 文件中 UITableViewCell 的插座连接到标签。为此,请右键单击 NIB 中的 UITableViewCell(您可以在 FileOwner 下方的左窗格中找到它)并连接插座。
  • 正确,但正确的连接是到您的自定义类,而不是 FileOwner。当您拖动引用出口时,将其放在层次结构中的自定义类上。问题是 IB 允许您将其拖到 FileOwner 并且存在您期望的 IBOutlet,但它不起作用。放在自定义类上会显示相同的插座,但它可以工作。
【解决方案2】:

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

Target Settings -> Build Phases -> Compile Sources

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

还有

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2018-07-13
      • 1970-01-01
      • 2017-09-27
      • 2015-08-27
      • 2011-03-17
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多