0

我正在开发我的第一个应用程序,现在是时候在真实设备上对其进行测试了。我在办公室有一部旧的 iPhone 3GS,我更新到了最新版本的 IOS。

当我尝试在 iPhone 模拟器上启动应用程序时,一切正常。但是,我尝试在我的设备上启动它,应用程序崩溃并出现以下错误:

2012-09-13 14:16:01.556 MyFirstApp[1702:707] *** Terminating app due to uncaught
exception 'NSUnknownKeyException', reason: '[<__NSCFString 0x15e2e0> valueForUndefinedKey:]: 
this class is not key value coding-compliant for the key testKey.'

我检查了我的构建设置,如下所示:

在此处输入图像描述

我也听说它可能来自一些在 IB 中没有正确设置或删除的变量,但我没有任何警告......

这是我在与错误有关的视图上使用的一些代码:

@implementation HomeViewController {
    @private
    NSArray *_orders;
    __strong UIActivityIndicatorView *_activityIndicatorView;
}

@synthesize orderList = _orderList;

- (void)reload:(id)sender {
    [_activityIndicatorView startAnimating];

    [Order orderListWithBlock:^(NSArray *orders) {
        if (orders) {
            _orders = orders;
            [self.orderList reloadData];
        }
        [_activityIndicatorView stopAnimating];
    }];
}

- (void)viewDidLoad
{
    [self reload:nil];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Custom Cell Segment";
    static NSString *OtherCellIdentifier = @"Other Cell Segment";
    Order *o = [_orders objectAtIndex:indexPath.row];

    if ([o.testKey isEqualToString:@""]) {
        [SOME STUFF]
    }
    else {
        [SOME OTHER STUFF]
    }
}

有谁知道错误可能来自哪里?

谢谢你的帮助 !

4

3 回答 3

0

我认为您正在使用界面构建器来开发用户界面,检查 IBOutlet 的警告,您更改了任何视图的名称。并检查文件 Owner 。

谢谢

于 2012-09-13T12:38:01.120 回答
0

在某处您尝试testKey使用键值编码访问该属性,但您尝试在没有该属性的对象上访问它(更具体地说,您正在尝试在字符串上访问它)。

我不知道在哪里以及为什么会发生这种情况,因为您没有发布任何代码。

检查您的项目是否有任何通过 KVC 完成的访问权限testKey(甚至可能是由于您在 xib 中放入的内容)。

于 2012-09-13T12:38:07.870 回答
0

这可能不是因为模拟器与设备的关系,而是因为您在 Interface Builder 中有一个旧的 IBOutlet 被删除,但连接仍然存在于 XIB 中。只需打开具有旧 IBOutlet“testKey”连接的 XIB 并删除连接。

现在,为什么您的应用程序到目前为止可以在您的模拟器上运行,这是因为 XIB 尚未重新编译,或者您从源代码中删除的一些旧 XIB 仍在先前构建的构建产品中。

所以我敢打赌,如果你完全清理你的项目,删除构建目录并从头开始重建,你将在模拟器中遇到同样的问题,从而可以重现和调试它。

为此,您可以从“产品”菜单执行“清理”,或者在打开此菜单以选择“清理构建文件夹...”时更好地使用选项键。有时它仍然不够,因此您可以从 Finder 中删除整个构建文件夹:

  • 打开管理器(菜单“窗口”->“管理器”)
  • 选择顶部的“项目”选项卡,然后在左侧选择您的项目
  • 单击“派生数据”区域旁边的“删除”按钮。

这将删除您的构建输出目录,以便下次构建项目时,它将从头开始重新编译所有内容。

从那里您可能会在 XIB 文件上看到警告,并且您会观察到您的应用程序也会在模拟器中崩溃,这意味着这不是由于设备导致的崩溃,而是由于以前的构建搞砸了您的构建应用。您可以为设备和模拟器修复此崩溃(通过删除 XIB 中旧的“testKey”插座连接)。

于 2012-09-13T12:38:14.007 回答