我很好奇使用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,也没有列出错误的连接)。
是否有其他人对此错误的发生有任何想法?
答案 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”。否则,我将继续使该类不符合密钥要求。所以现在我有了该类的单元格和文件所有者。