自定义表格单元格:“类不符合键值编码”

时间:2012-05-22 17:02:24

标签: ios xcode uitableview interface-builder

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

我正在构建一个标签式应用程序,它在表视图中需要自定义单元格。我已经做了几次这样的事情,在连接这些自定义单元格时,我似乎总是碰到一个减速带。应用程序启动正常,直到我开始在名为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

歌曲TVC.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;
}

界面生成器 The cell, its outlets, and its class


File's owner

Report

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


更新:XML格式的xib文件为pasted here.

3 个答案:

答案 0 :(得分:2)

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

例如,如果在连接某些插座后更改了文件所有者类,则可能会使其混淆。

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

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

答案 1 :(得分:1)

不幸的是,我发现的唯一解决方案是重新开始。我完全像以前一样做了所有事情,并且第二次工作。这是一件非常繁琐的事情,不得不废弃整件事并重新开始,但这是我能让它发挥作用的唯一方法。除非有人能弄清楚发生了什么,否则我将其作为答案。 (见原帖及其更新)

答案 2 :(得分:0)

我有一个类似的问题,并且能够通过重建Storyboard / NIB来解决它。