`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.`
StartScreenViewController的prepareForSegue方法如下所示
if ([[segue identifier] isEqualToString:@"register"] || [[segue identifier] isEqualToString:@"forgotPassword"]) {
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[segue destinationViewController]];
appDelegate.window.rootViewController = navController;
}
设置断点显示该方法仍然被称为corectly,但在prepareForSegue完成后,应用程序崩溃并出现上述错误。有人能指出我正确的方向吗?
非常感谢你 马丁
答案 0 :(得分:5)
因为您正在使用push segue
Cocoa正在寻找 StartScreenViewController 的层次结构中的祖先导航控制器。
prepareForSegue
:您可以配置即将由iOS自动显示的VC。 显示 VC是您的责任,这是您在设置window.rootViewController时所做的事情。
您可能需要仔细阅读这些文档:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html
答案 1 :(得分:5)
你可以说“应用程序运行正常”,但事实是你引用的代码总是非常错误的,所以看来这种错误现在暴露了。您永远不应该在应用程序中间更改窗口的根视图控制器;你应该在发布时设置一次,而不是再次设置它。并且,正如Joshua正确地说的那样,准备一个segue不是让你弄乱视图控制器结构的时候,而segue本身就要捣乱。
你的手上有一个篮子盒子。在你采取另一个步骤之前,停止并理解iOS和视图控制器(以及故事板)可能是一个好主意,因为你可能最终会撕掉这个应用程序的整个架构以使其正确。这是一些帮助:
答案 2 :(得分:2)
我有同样的问题。当从app Store商店下载时,应用程序在ios6设备上运行良好,但相同的代码在设备或模拟器上无效。非常奇怪的问题。
我的应用结构如下:
NavigationController - > UIViewController (具有PageControl,保存多个页面,可水平滚动) - > UITableViewController (代表一个类别的新闻列表),当用户点击单个新闻时,获取 DetailsViewController (UIViewController的实例)。
这是prepareForSegue的代码:
if ([[segue identifier] isEqualToString:@"ShowTelegrafDetails"]){
TelegrafDetailsViewController *details = (TelegrafDetailsViewController*)segue.destinationViewController;
NSIndexPath *myIndexPath = [self.tableView indexPathForSelectedRow];
if([self isItPad])
details.linkFromTableView = [[otherNews objectAtIndex:myIndexPath.row] link];
else
details.linkFromTableView = [[[myViewController.itemMatrix objectAtIndex:[self calculateCurrentPage]] objectAtIndex:myIndexPath.row] link];
NSLog(@"%@",segue.sourceViewController);
NSLog(@"%@",segue.destinationViewController);
[self.myViewController.navigationController pushViewController:details animated:YES];
}
似乎源视图控制器按照预期设置,我使用故事板并自动设置NavigationController。我不知道是否必须在某处显式设置RootViewController,但在AppDelegate中设置它可能会很棘手,因为我在委托和应该是root(UITableViewController)的类之间还有两个视图层次结构。
如果有人知道更多关于它的事情我会永远感激,否则我可以使用一些指示。我已经阅读了关于这个主题的苹果文档,但是当涉及到这种复杂的情况时,我无法完全理解它。
另外,如果我找到任何解决方案,我很乐意像老板一样在这里发布。 :d
提前完成。
修改强>
我设法解决了这个问题。刚删除了segues,并将 prepareForSegue 中的代码放入 didSelectRowAtIndexPath 中,并进行适当的更正。它不是一个理想的解决方案,但可以解决问题。虽然,我计划支持4.3+设备,但在这种情况下,故事板不是一种选择。
此外,我已经仔细检查了代码,发现RootViewController已正确创建和显示,NavigationController运行良好,我仍然无法理解为什么segues不会工作。
干杯。