【问题标题】:Connecting IBOutlet results in nsunknownkey exception连接 IBOutlet 导致 nsunknownkey 异常
【发布时间】:2014-03-17 11:17:54
【问题描述】:

我知道你一读到标题你一定在想.. 这很常见,但相信我,过去 2 天我一直在用这个来敲打我的头。我已经尝试了 stackoverflow 和其他我可以在互联网上找到的所有解决方案,但没有任何效果。我什至尝试重新开始我的项目(幸运的是,我在最初阶段就被卡住了),但它仍然抛出了同样的异常。

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

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

在 cellForRowAtIndexPath 处,我只需执行 dequeueReusableCellWithIdentifier。 到目前为止,一切都很好。我启动了这个项目,一切运行正常。我可以看到我的自定义单元格正在表格视图中加载。

当我将自定义单元格中的任何控件连接到 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;

【问题讨论】:

  • 您是否将自定义类名设置为包含属性/变量“vidName”的表格视图单元类?
  • 发布你的 cellForRowAtIndexPath 方法,也许我们可以看到上面有什么。
  • 用代码更新了我的问题..
  • 您是连接到文件所有者还是单元格视图?
  • 我不确定我是否正确地关注了你。我将上述标签连接到我的 customcell 类的文件所有者。

标签: ios objective-c exception uitableview


【解决方案1】:

您需要为恢复 ID 和类设置相同的值。

【讨论】:

    【解决方案2】:

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

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

    我错过了什么吗?

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

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

    - (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

    【讨论】:

    • “您将 Interface Builder 中的单元格实例设置为自定义单元格类——而不是文件的所有者”。这是为我做的......你是一个救生员!但我还是不明白..文件所有者不是和自定义单元格一样吗?
    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    相关资源
    最近更新 更多