创建自定义UITableViewCell时崩溃

时间:2014-10-28 10:58:32

标签: ios objective-c uitableview

我正在尝试使用 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之间匹配:

enter image description here

我看过这篇文章here,但我似乎无法让它发挥作用。

非常感谢帮助。

修改

这是一张显示自定义类设置的图片。下面是我tableViewCell的初始化者:

enter image description here

以下是标题:

#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

4 个答案:

答案 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)

我认为您将单元格的文件所有者设置为自定义单元格,您不应该这样做。为自定义单元格工作的方法是,

  1. 在你的xib中,让一个Table View Cell组件填充其ContentView中单元格的内容。

  2. 将您的班级CustomReferenceTableViewCell设为该单元组件的自定义类。

  3. 现在,不要在你的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;
            }
        }
    }
    
  4. 过去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;窗格和控件+单击并从那里拖动以使连接工作。然后我原来发布的代码就可以了。

非常感谢所有回复的人。