2012-09-29 32 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不會工作。

乾杯。

相關問題