0

我有一段简单的代码将一个新的视图控制器推送到我的导航控制器上

- (IBAction)buttonSelected:(id)sender{
    caseBillingFormViewController = [[CaseBillingFormViewController alloc] initWithStyle:UITableViewStyleGrouped];
    caseBillingFormViewController.returnScreen = @"FALSE";
    [self.navigationController pushViewController:caseBillingFormViewController animated:YES];
}

我在最后一行崩溃了:

[self.navigationController pushViewController:caseBillingFormViewController animated:YES];

我不知道为什么会发生这种情况,它是 iOS6 的新增功能。升级版本之间的代码库没有改变,所以我不确定为什么会这样。

我的 caseBillingFormViewController 在我的界面中命名:

CaseBillingFormViewController *caseBillingFormViewController;

我检查了 self.navigationController 的完整性,一切都检查出来了:

NSLog(@"%i",[self.navigationController respondsToSelector:@selector(pushViewController:animated:)]); 
//gives 1

问题是这只出现在由 UITableView 管理的屏幕上 -

caseBillingFormViewController = [[CaseBillingFormViewController alloc] initWithStyle:UITableViewStyleGrouped];
//crashes

savedOrdersViewController = [[SavedOrdersViewController alloc] initWithNibName:@"SavedOrdersViewController" bundle:[NSBundle mainBundle]];
//does not crash

任何人都可以解释为什么会这样吗?
在 Simulator 5.1 和 Simulator 6.0 上测试了相同的代码 - 错误只发生在后者上。

注意,错误是:

'NSUnknownKeyException', reason: '[<CaseBillingFormViewController 0xc09c0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key theTableView.'
4

2 回答 2

1

请注意,'initWithNibName:bundle:' 是 UIViewController 的指定初始化程序。你的子类有两个 nils(没关系)?您不知道 UIViewController 在其 init 例程中正在做什么,因此您必须调用它,否则您将处于不稳定的状态。

如果这在过去有效,我假设您实现了“loadView”。如果是这样,您可以在您的子类 init 中使用指定为属性的样式创建您的表(只要它调用指定的超级。)

它以前有效而现在无效的原因是你很幸运 - Apple 现在必须在 'initWithNibName:bundle:' 中做一些重要的事情。

此外,如果您正在继承 UITableViewController(不是 UIViewController),则可能需要将 self.tableView 设置为 self.view - 不确定 - 但无论如何,您应该在创建对象之后但在推送它之前验证两者view 和 tableView 已设置 - 通过在推送之前记录它们。如果其中一个为 nil,则不要继续。

于 2012-09-26T18:18:06.760 回答
0

好的,由于我假设它不相关,我没有提到CaseBillingFormViewController曾经有一个 xib 文件 - 当我意识到 xib 文件根本没有做太多事情时,我删除了它并将类转换为UITableViewController 与所有适当的初始化程序。

我会澄清...
CaseBillingFormViewController.xib不存在。
它被删除,所有引用被删除,文件本身被丢弃并清空。我什至去检查编译的源代码,正如我所想的那样,它不存在......

因此,为什么我认为它不相关。

要修复,我必须从我的设备和模拟器中删除应用程序,然后清理构建,重新启动我的机器,再次清理然后构建。听起来很复杂,即使没有其中一个步骤,错误仍然存​​在。

X-Code 中有一个错误,它不会注册已删除的文件,尤其是 xibs 和故事板。以下是苹果公司的回应:

Xcode 在假设哪些文件已被更改时并不准确,从而引发了应用程序包的重新构建,特别是对于故事板和 xib 文件。正如您所指出的,您必须对其进行干净的操作才能实现您的更改。这是 Xcode 中的一个错误。

如果您想保留沙盒的其余部分(即 Documents 文件夹等),Xcode Organizer 允许您将应用程序的standbox(减去应用程序包)从设备下载到您的 Mac,然后您可以将其上传回来更改应用程序后到设备。因此,在管理器中,选择设备及其“应用程序”项,选择适当的应用程序,单击“下载”按钮,这将下载该沙箱中的数据文件。

即使该文件已被删除,它仍在从中读取变量。错误中的 UITableView 实例theTableView在被删除之前已经存在于 xib 中。

这并不意味着它是固定的,但它确实意味着解决方案不在 SO 中的任何人手中。无论如何,感谢您的帮助。

于 2012-10-02T08:40:29.220 回答