我很好奇使用 xib 文件布局 UITableViewCell 内容的正确方法。当我尝试按照我在互联网上找到的所有步骤时,我总是得到
由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[<NSObject 0x10fe7d790> 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 也没有列出错误的连接)。
有没有其他人对这个错误是如何产生的有任何想法?