我有一段简单的代码,可以将新的 View Controller 推送到我的导航 Controller 上
- (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.'
最佳答案
请注意,“initWithNibName:bundle:”是 UIViewController 的指定初始值设定项。你的子类是否带有两个零(这是可以的)?你不知道 UIViewController 在它的 init 例程中做了什么,所以你必须调用它,否则你的理由就站不住脚。
如果这在过去有效,我假设您实现了“loadView”。如果是这样,您可以在子类 init 中使用指定为属性的样式创建表(只要它调用指定的 super 即可。)
它以前有效而现在无效的原因是你很幸运 - Apple 现在肯定在“initWithNibName:bundle:”中做一些重要的事情。
此外,如果您要子类化 UITableViewController (不是 UIViewController),则可能需要将 self.tableView 设置为 self.view - 不确定 - 但无论如何,您应该在创建对象之后但在推送之前进行验证view 和 tableView 都已设置 - 通过在推送之前记录它们。如果其中一个为零,则不要继续。
关于ios - UINavigationController 在 iOS6 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606209/