我正在尝试使用 xib 创建自定义表格视图单元格但是当我调用时:
CustomReferenceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
我得到以下内容:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7aa59c00> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key
这是我的设置:
- (void)viewWillAppear:(BOOL)animated
{
[self.tableView registerNib:[UINib nibWithNibName:@"CustomReferenceTableViewCell"
bundle:[NSBundle mainBundle]]
forCellReuseIdentifier:@"referenceCell"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"referenceCell";
CustomReferenceTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[CustomReferenceTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.number.text = @"1";
cell.referenceName.text = @"Name";
cell.reference.text = @"The text of the reference";
return cell;
}
这是我在界面构建器中的连接的图片。我的cellIdentifiers也在class和xib之间匹配:
我看过这篇文章here,但我似乎无法让它发挥作用。
非常感谢帮助。
修改
这是一张显示自定义类设置的图片。下面是我tableViewCell
的初始化者:
以下是标题:
#import <UIKit/UIKit.h>
@interface CustomReferenceTableViewCell : UITableViewCell
@property (nonatomic, weak) IBOutlet UILabel *number;
@property (nonatomic, weak) IBOutlet UILabel *referenceName;
@property (nonatomic, weak) IBOutlet UILabel *reference;
@end
以下是实施:
#import "CustomReferenceTableViewCell.h"
@implementation CustomReferenceTableViewCell
- (void)awakeFromNib {
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end
答案 0 :(得分:2)
尝试将static NSString *cellIdentifier = @"referenceCell";
设置在 @interface 之上
并将 registerNib 从 WillAppear 更改为 viewDidLoad 。您也可以更改单元格创建
CustomReferenceTableViewCell *cell = (CustomReferenceTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[NSBundle mainBundle]loadNibNamed:@"CustomReferenceTableViewCell" owner:self options:nil] lastObject];
}
答案 1 :(得分:2)
我认为您将单元格的文件所有者设置为自定义单元格,您不应该这样做。为自定义单元格工作的方法是,
在你的xib中,让一个Table View Cell组件填充其ContentView
中单元格的内容。
将您的班级CustomReferenceTableViewCell
设为该单元组件的自定义类。
现在,不要在你的tableview中注册单元格;相反,在[cellForRowAtIndexPath
后单元格为nil
后,在tableView dequeueReusableCellWithIdentifier:cellIdentifier];
中执行以下操作,然后注册:
cell = [self.tableView dequeueReusableCellWithIdentifier:cellID];
if(cell == nil) {
[self.tableView registerNib:[UINib nibWithNibName:[@"CustomReferenceTableViewCell" ] bundle:nil] forCellReuseIdentifier:cellID];
NSArray *nibContents;
CustomReferenceTableViewCell *cell;
nibContents = [[NSBundle mainBundle]
loadNibNamed:nibName owner:self options:NULL];
NSEnumerator *nibEnumerator = [nibContents objectEnumerator];
NSObject *nibItem = nil;
while ((nibItem = [nibEnumerator nextObject]) != nil) {
if ([nibItem isKindOfClass:[CustomReferenceTableViewCell class]]) {
cell = (CustomReferenceTableViewCell *)nibItem;
}
}
}
过去8个月,这种方法一直在为我而努力。我没有理由为什么它会给你带来麻烦。
答案 2 :(得分:0)
只需关注我的应用编码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"Reuse"];
NSArray *nib=[[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
if(cell == nil)
{
cell = [nib objectAtIndex:0];
}
cell.number.text = @"1";
cell.referenceName.text = @"Name";
cell.reference.text = @"The text of the reference";
return cell;
}
答案 3 :(得分:0)
首先,CodingVoldermort的回答帮助我解决了这个问题。我将文件所有者设置为我不应该做的自定义类。这应该留作NSObject。
我认为需要更改的原因是因为我无法通过控制并单击占位符下的tableview图像并拖动到xib中的相应视图来连接我的IBOutlet。
相反,我需要进入&#39;显示连接检查器&#39;窗格和控件+单击并从那里拖动以使连接工作。然后我原来发布的代码就可以了。
非常感谢所有回复的人。