认为不适用于iOS6

时间:2012-09-29 15:52:02

标签: iphone uinavigationcontroller ios6 segue

如果我的问题听起来对你们有些愚蠢,请原谅我。我对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;
}

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

非常感谢你 马丁

3 个答案:

答案 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和视图控制器(以及故事板)可能是一个好主意,因为你可能最终会撕掉这个应用程序的整个架构以使其正确。这是一些帮助:

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

答案 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不会工作。

干杯。