【问题标题】:Custom table cell: "class is not key value coding-compliant"自定义表格单元格:“类不符合键值编码”
【发布时间】:2012-05-29 05:11:42
【问题描述】:

更新:我决定重新开始,因为我还处于这个应用程序的早期阶段。我重复了所有内容,无论出于何种原因,自定义单元格都进行了第二次。我将保留旧文件以确认另一个答案,因为我想我不是唯一会遇到此问题的人。

我正在构建一个需要在其表格视图中自定义单元格的选项卡式应用程序。我已经这样做了几次,在连接这些自定义单元时,我似乎总是遇到减速带。该应用程序启动良好,直到我开始在我的表格视图控制器中使用名为 SongsTVC 的自定义单元格。我收到终止合同的原因是:

[<SongsTVC 0x6831330> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key albumLabel.

我正在使用this tutorial,并且之前成功使用过它(为 ARC 和 iOS 5 更改了一些内容)。事实上,我使用的代码和 IB 布局是基于我已经在工作的项目。我知道当您将插座连接到文件所有者而不是单元格本身时,通常会出现此错误。我没有犯这个错误,但它仍然给我这个错误。到目前为止,我已经删除了它有问题的标签,甚至完全删除了单元格的文件以便重新开始。任何帮助,将不胜感激。

SongCell.h

#import <UIKit/UIKit.h>

@interface SongCell : UITableViewCell{

}

@property(nonatomic, assign) IBOutlet UILabel *titleLabel;
@property(nonatomic, assign) IBOutlet UILabel *artistLabel;
@property(nonatomic, assign) IBOutlet UILabel *albumLabel;

@end

SongCell.m

#import "SongCell.h"

@interface SongCell ()

@end

@implementation SongCell

@synthesize titleLabel, artistLabel, albumLabel;

@end

SongsTVC.h - TableViewController 的标头

#import <UIKit/UIKit.h>

@interface SongsTVC : UITableViewController{
    UINib *cellLoader;
}

@end

SongsTVC.m - 相关的 TableViewController 方法

#import "SongsTVC.h"
#import "SongCell.h"

@interface SongsTVC ()

@end

static NSString *CellClassName = @"SongCell";

@implementation SongsTVC

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
        cellLoader = [UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]];
    }
    return self;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    SongCell *cell = (SongCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];

    if (!cell)
    {
        //CRASH ERROR POINTS HERE
        NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
        cell = [topLevelItems objectAtIndex:0];
    }

    // Configure the cell...
    cell.titleLabel.text = @"SONG";
    cell.artistLabel.text = @"Artist";
    cell.albumLabel.text = @"Album";

    return cell;
}

界面构建器


注意:单元格标识符已在 IB 中设置为“SongCell”,文件所有者为 UITableViewController,因为多个表将使用此单元格。只要视图是一个表格,它就应该可以工作(过去有)。


更新:xml格式的xib文件已经pasted here.

【问题讨论】:

  • instanceWithOwner 方法定义在哪里?
  • @rishi 是UINib的实例方法,由Apple here定义。
  • 谢谢,我不知道,所以在返回数组之前它会崩溃或返回数组?
  • @rishi 崩溃报告显示,topLevelItems 在终止时包含单个 NSObject(属于 Class,意思是 self)。
  • 你试过调试cellLoader,不管它是否实例化?

标签: ios xcode uitableview interface-builder


【解决方案1】:

我今天遇到了这个确切的问题,同时为另一个 SO 答案制作了一个示例项目!看起来您的 xib 正在尝试将插座连接到您的视图控制器而不是您的单元格。在您的屏幕截图中,出口看起来定义正确,但有时旧的出口定义可能会留在底层 XML 中并导致这种类型的崩溃。

例如,如果您在连接某些插座后更改了文件所有者类,这可能会造成混淆。

您可以通过将 xib 作为“源代码”打开来找到它,查找元素并检查是否只有您期望的条目。或许也可以在 XML 文件中搜索 albumLabel

如果这不起作用,您可能不得不废弃 xib 并重新开始。

【讨论】:

  • 现在检查。我会告诉你我发现了什么。
  • 我正在梳理它,它似乎是正确的形式。 XML 中只显示了 4 个 albumLabel 实例,看起来没问题。我在原始问题中添加了一个 pastebin.com 链接。我会继续寻找,但如果你之前遇到过这个问题,也许你会先看到它(如果你不介意的话)。
  • 看不到任何异常,抱歉。您实际上与文件所有者有任何联系或链接吗?你能以 nil 作为所有者加载 nib 吗?
  • 看起来没有。我将所有者设置为 nil 并得到了同样的崩溃。然后我尝试了随机对象,甚至单元对象本身。每次都出现同样的错误...
  • 我放弃了,开始了一个新项目。自定义单元第二次工作。如果有人能弄清楚为什么第一个项目被炸毁,我会留下这个问题。不过感谢您的帮助!
【解决方案2】:

不幸的是,我找到的唯一解决方案是重新开始。我做的一切都和以前完全一样,第二次就成功了。不得不放弃整个事情并重新开始是一件很麻烦的事,但这是我让它工作的唯一方法。除非有人能弄清楚发生了什么,否则我将把它作为答案。 (见原帖及其更新)

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,并且能够通过重建 Storyboard/NIB 来解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多