2012-09-29 56 views
5

如果我的问题听起来可能听起来很愚蠢,对你们中的一些人。我对iOS开发相对比较陌生,但我必须为iOS6移植一个应用程序。该应用程序在iOS 5和XCode 4.3.2上完美工作,但我在iPhone 6.0模拟器上遇到了Xcode 4.5的一个奇怪的错误。 初始画面加载后我可以打任何按钮,我想,我也得到了错误:塞格不与iOS6工作

`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完成后,该应用程序崩溃与前面提到的错误。任何人都可以将我指向正确的方向吗?

非常感谢您 马丁

回答

5

由于您使用的是push segue可可在层次 StartScreenViewController寻找祖先的导航控制器。

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

prepareForSegue:存在你配置一个VC这是关于获得自动的iOS显示。这是不是你的责任显示 VC,这是你设置window.rootViewController时,你似乎在做什么。

您可能希望通过这些文档阅读:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

5

你可以说:“该应用程序是完美的工作”,但事实是,你引用的代码总是很错误的,所以它看起来这个不正当的现在正在曝光。您绝对不应该在应用程序中间更改窗口的根视图控制器;你应该在启动时设置一次,永远不要再次设置。而且,正如约书亚所说的那样,准备暂停并不是一个让你乱糟糟的视图控制器结构的时候,而这个结构本身就会陷入混乱。

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

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

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

Thanx提前。

编辑:

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

此外,我已经双重检查代码,发现RootViewController正确创建和显示,NavigationController工作正常,我仍然不明白为什么segues不会工作。

干杯。