我很好奇如何使用xib文件来布局UITableViewCell的内容。当我尝试遵循我在互联网上找到的所有步骤时,我总是得到
由于未捕获的异常"NSUnknownKeyException"而终止应用程序,原因:"[lt;NSObject 0x10fe7d790>setValue:forUndefinedKey:]:此类与键状态标签的键值编码不兼容。'
所以这里是相关的代码
@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,当然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,也没有列出错误的连接)。
其他人有没有想过这个错误是怎么发生的?
我必须确保在创建出口时指定我挂接的是单元格,而不是对象的所有者。当您将连接从单元格中的标签拖动到类时,会出现菜单,以便您可以命名它,并且您必须在"对象"下拉菜单中选择它(您可以选择"文件所有者"或单元格的类名,选择单元格的类名)。当然,您也必须将单元格的类声明为此类,而不仅仅是"TableViewCell"。否则,我会不断得到不符合密钥的类。所以现在我有了该类的单元格和文件所有者。
您是否已连接Cell Nib文件中"messageLabel和statusLabel"的出口?该错误表示在Nib文件中找不到"statusLabel"的IBOutlet属性(连接问题)。
还要检查MyCell.xib文件是否(错误地!)被添加到中
Target Settings -> Build Phases -> Compile Sources
编译源是针对所有.m文件,而不是针对.Xib资源文件。
和
Copy Bundle资源用于.Xib资源文件。