5

如果我的问题对你们中的某些人来说听起来很愚蠢,请原谅。我对 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.`

StartScreenViewController 的 prepareForSegue 方法如下所示

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

设置断点显示该方法仍然被正确调用,但是在 prepareForSegue 完成后,应用程序因上述错误而崩溃。有人能指出我正确的方向吗?

非常感谢马丁

4

3 回答 3

5

您可以说“该应用程序运行良好”,但事实是您引用的代码总是非常错误,因此现在似乎这种错误正在暴露出来。您永远不应该在应用程序中间更改窗口的根视图控制器;你应该在启动时设置一次,以后不要再设置了。而且,正如 Joshua 所说的那样,为 segue 做准备不是时候让你去搞乱视图控制器结构,因为 segue 本身就要搞砸了。

你手上有一个篮子箱。在你迈出下一步之前,停止并了解 iOS 和视图控制器(和故事板)可能是一个好主意,因为你最终可能会破坏这个应用程序的整个架构以使其正确。这里有一些帮助:

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

于 2012-09-29T16:23:05.267 回答
5

因为您使用的是Cocoa,所以在StartScreenViewController的层次结构中push segue 寻找祖先的导航控制器

  • 如果找到,它将使用它将新的视图控制器自动推送到该导航控制器的堆栈上。
  • 由于找不到,您的应用程序正在崩溃。

prepareForSegue: 为您配置一个即将被 iOS 自动显示的 VC。显示VC不是您的责任,这似乎是您在设置 window.rootViewController 时所做的。

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

于 2012-09-29T16:13:00.727 回答
2

我也有同样的问题。应用程序在 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 中设置它可能会很棘手,因为我在委托和应该是根的类 (UITableViewController) 之间还有两个视图层次结构。

如果有人对此有所了解,我将永远感激不尽,否则我可以使用一些指示。我已经阅读了苹果关于这个主题的文档,但是当涉及到这种复杂的情况时,我无法完全理解它。

另外,如果我找到任何解决方案,我会很乐意像老板一样在这里发布。:D

提前谢谢。

编辑:

我已经设法解决了这个问题。刚刚删除了 segues,并将prepareForSegue中的代码放入didSelectRowAtIndexPath中,并进行了适当的更正。这不是一个理想的解决方案,但可以解决问题。虽然,我计划支持 4.3+ 设备,但在这种情况下故事板不是一个选项。

另外,我仔细检查了代码,发现 RootViewController 已正确创建和显示,NavigationController 运行良好,但我仍然不明白为什么 segues 不起作用。

干杯。

于 2012-10-01T10:14:31.663 回答