iOS6中的UINavigationController崩溃

时间:2012-09-26 16:24:09

标签: ios uitableview uinavigationcontroller ios6

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

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

2 个答案:

答案 0 :(得分:1)

请注意,'initWithNibName:bundle:'是UIViewController的指定初始值设定项。你的子类是否有两个nils(哪个可以)?你不知道UIViewController在它的init例程中正在做什么,所以你必须调用它,或者你是在摇摇欲坠的理由。

如果这在过去有效,我假设你实现了'loadView'。如果是这样,你可以在你的子类init中创建一个带有指定为属性的样式的表(只要它将指定的一个调用为super。)

它以前工作的原因现在没有,你很幸运 - Apple必须在'initWithNibName:bundle:'中做一些重要的事情。

另外,如果你是UITableViewController(不是UIViewController)的子类,你可能需要将self.tableView设置为self.view - 不确定 - 但是在任何情况下你应该在创建对象之后但在推送之前验证它通过在推送之前记录它们来设置视图和tableView。如果其中任何一个为零,则不要继续。

答案 1 :(得分:0)

好的,由于我认为它不相关,我没有提到CaseBillingFormViewController以前有一个xib文件 - 当我意识到xib文件根本没有做太多时,我删除了它并将类转换为具有所有适当初始化器的UITableViewController。

我会澄清......
CaseBillingFormViewController.xib不存在 它被删除,所有引用都被删除,文件本身被删除和清空。 我甚至去检查编译的来源,正如我想的那样,它不在那里......

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

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

X-Code中存在一个错误,它不会注册已删除的文件,特别是xib和storyboard。以下是Apple的回复:

  

假设哪些文件已经存在,Xcode不准确   改变了,引发了应用程序包的重新构建,特别是对于   故事板和xib文件。如你所说,你必须干净   操作它来实现你的改变。这是Xcode中的一个错误。

     

如果要保留沙盒的其余部分(即文档   文件夹等),Xcode Organizer让你下载应用程序   从您的设备到Mac的Standbox(减去应用程序包)   可以在应用程序发布后将其上传回设备   改变。因此,在管理器中,选择设备及其   在“应用程序”项中,选择相应的应用程序,单击   下载按钮,将下载该沙箱中的数据文件。

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

这并不意味着它已经修复,但它确实意味着解决方案不在SO的任何人手中。无论如何,谢谢你的帮助。