认为不适用于iOS6

Mar*_*uer 5 iphone uinavigationcontroller segue ios6

如果我的问题听起来对你们有些愚蠢,请原谅.我对iOS开发相对较新,但我必须为iOS6移植应用程序.该应用程序在iOS 5和XCode 4.3.2上运行良好,但我在iPhone 6.0模拟器上有一个奇怪的Xcode 4.5错误.加载初始屏幕后,我可以点击我想要的任何按钮,我收到错误:

 `Terminating app due to uncaught exception 'NSGenericException', reason: 'Could not find a navigation controller for segue 'register'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.`
Run Code Online (Sandbox Code Playgroud)

StartScreenViewController的prepareForSegue方法如下所示

if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) {
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]];
    appDelegate.window.rootViewController = navController;
}
Run Code Online (Sandbox Code Playgroud)

设置断点显示该方法仍然被称为corectly,但在prepareForSegue完成后,应用程序崩溃并出现上述错误.有人能指出我正确的方向吗?

非常感谢马丁

Jos*_*low 5

因为你正在使用push segue Cocoa在StartScreenViewController 的层次结构寻找一个祖先的导航控制器.

  • 如果找到一个,它将使用它自动将新的视图控制器推送到该导航控制器的堆栈.
  • 由于它找不到,你的应用程序崩溃了.

prepareForSegue:您可以配置即将由iOS自动显示的VC.显示 VC 不是您的责任,这是您在设置window.rootViewController时似乎正在执行的操作.

您可能需要阅读这些文档:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html


mat*_*att 5

您可以说"应用程序运行正常",但事实是您引用的代码总是非常错误,所以现在似乎已经暴露了这种错误.您永远不应该在应用程序中间更改窗口的根视图控制器; 你应该在发布时设置一次,而不是再次设置它.并且,正如Joshua正确地说的那样,准备一个segue不是让你弄乱视图控制器结构的时候,而segue本身就要捣乱.

你的手上有一个篮子盒子.在你采取另一个步骤之前,停止并理解iOS和视图控制器(以及故事板)可能是一个好主意,因为你可能最终会撕掉这个应用程序的整个架构以使其正确.这里有一些帮助:

http://www.apeth.com/iOSBook/ch19.html