连接IBOutlet会导致nsunknownkey异常

时间:2014-02-17 23:22:21

标签: ios objective-c exception uitableview

我知道你一看到标题就一定要思考......这很常见但是相信我,过去两天我一直在用这个来敲打我的脑袋。我已经尝试了stackoverflow和其他地方提到的每个解决方案,我可以在互联网上找到但没有任何作用。我甚至尝试重新开始我的项目(幸运的是,我在最初阶段陷入困境)但它仍然会抛出同样的异常。

以下是我的问题的说明。我已经创建了一个自定义单元格作为UITableViewCell的子类(很常见的呃)。现在我的视图控制器(在其中添加了UITableView)在viewdidload中为我的customcell注册了nib。

[self.tableView registerNib:[UINib nibWithNibName:@"VideoCustomCell"
                                           bundle:[NSBundle mainBundle]]
     forCellReuseIdentifier:@"CustomCellReuseID"];

并且在cellForRowAtIndexPath中我只是做一个dequeueReusableCellWithIdentifier。 到现在为止还挺好。我启动项目,一切正常。我可以在tableview中看到我的自定义单元格被加载。

当我将自定义单元格中的任何控件连接到IBOutlet时,问题就开始了。它抛出*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0xa4b4fe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key vidName.'

现在我尝试了所有这些:

  • 将XIB的文件所有者更改为我的自定义单元格类,更改为NSObject,更改为我的视图控制器,但没有运气。

  • 更改插座的名称(如果可能存在命名冲突)但结果仍然相同。

  • 将“主界面”更改为不同的视图控制器,并将其留空,但仍然没有。

  • 我甚至尝试删除除了单元格中的一个标签之外的所有其他控件,当我连接时它仍会抛出异常。

仅供参考。我的项目是一个通用项目,我正在使用Xcode 5。

更新:cellForRowAtIndexPath代码

NSString *CellIdentifier = @"CustomCellReuseID";
VideoCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.vidName.text = [NSString stringWithFormat:@"%d",indexPath.row];
return cell;

2 个答案:

答案 0 :(得分:2)

您需要为Restoration ID和Class设置相同的值。 enter image description here

答案 1 :(得分:1)

从目前为止我收集到的信息来看,您似乎有以下设置:

  • 具有UITableViewController和相关表视图控制器类
  • 的故事板
  • 自定义单元格的Xib,您正在使用表格视图上的registerNib进行注册
  • 用于动态设置vidName标签文本的自定义单元类。

我错过了什么吗?

所以这里有一些指导方针。为表视图单元格创建Xib文件时,将Interface Builder中的单元格实例设置为自定义单元格类 - 而不是文件的所有者。然后,将标签出口连接到接口构建器中的单元实例。像这样:

enter image description here

现在你的其余代码应该可以工作:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.tableView registerNib:[UINib nibWithNibName:@"VideoCustomCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomCellReuseID"];
}

#pragma mark - UITableView Delegate/DataSource

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
{
    return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *CellIdentifier = @"CustomCellReuseID";
    VideoCustomCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    cell.vidName.text = [NSString stringWithFormat:@"%d",indexPath.row];
    return cell;
}

我在这里发布了一个示例项目,可以进一步提供帮助:https://github.com/perlmunger/BasicTableViewCustomCell