2012-04-23 59 views
1

我用我的自定義UIViewController子類初始化UINavigationController。但是,只要我想呈現視圖控制器,我就會在Xcode中遇到一個SIGABRT錯誤。我之前做過這麼多次,並且我認爲存在這個問題是因爲其他事情在我目前的項目中可能不正確。但是,我發現很難找到這種現象背後的問題。那麼是否有一些事情可以通過某種方式阻止模態視圖控制器的呈現?呈現模態ViewController導致SIGABRT

這是我提出我的視圖控制器:

- (IBAction)tutorialTouched:(id)sender { 

    TutorialViewController *tutorialVC = [[TutorialViewController alloc]init]; 
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:tutorialVC]; 
    nav.modalPresentationStyle = UIModalPresentationFormSheet; 

    // This line leads to `SIGABRT` 
    [self presentModalViewController:nav animated:NO]; 
} 

部署目標是5.0。

更新: 這是打字bt到控制檯時,我得到的信息:

#0 0x945919c6 in __pthread_kill() 
#1 0x9645bf78 in pthread_kill() 
#2 0x9644cbdd in abort() 
#3 0x003169dc in uncaught_exception_handler() 
#4 0x032010fc in __handleUncaughtException() 
#5 0x02f00f0f in _objc_terminate() 
#6 0x0349e8de in safe_handler_caller() 
#7 0x0349e946 in std::terminate() 
#8 0x0349fb3e in __cxa_rethrow() 
#9 0x02f00e15 in objc_exception_rethrow() 
#10 0x03137de0 in CFRunLoopRunSpecific() 
#11 0x03137c9b in CFRunLoopRunInMode() 
#12 0x035ca7d8 in GSEventRunModal() 
#13 0x035ca88a in GSEventRun() 
#14 0x016b3626 in UIApplicationMain() 
#15 0x00002fad in main (argc=1, argv=0xbffff5a8) at /Users/myProject/main.m:14 
+0

它在控制檯中說了什麼? – Nic 2012-04-23 12:28:39

+1

您能否在您的Xcode調試器控制檯中提供詳細的錯誤信息?如果應用程序用SIGABRT退出,應該有一些關於異常的信息。如果您在iOS 4.x模擬器上,則可能有一個例外是「NSInvalidArgumentException」。 – Hailei 2012-04-23 12:28:49

+0

也許問題是塊(完成)是空的。嘗試在其中添加一些虛擬代碼(NSLog)。 – kuba 2012-04-23 12:39:14

回答

4

這個問題是由於我的ViewController中出現Outlet錯誤。我無法弄清楚,因爲編譯器從來沒有告訴過我這些。只有當我在視圖控制器的表示周圍添加一個try/catch時,我纔得到異常對象,它最終告訴我什麼是錯誤的。對不起,感謝您的幫助。

+0

這也是我的問題。這就是說,xcode無法警告有關錯誤的插座,我在h和m文件中將IBOutlet重命名,但不在xib文件中...似乎是應該跳轉的東西!:) – 2012-04-27 20:06:05

0

答案很簡單,刪除塊代碼和最後一行恰克到

[self presentModalViewController:nav animated:YES]; 

在Nav中你可以使用ViewDidLoad做任何附加的代碼

爲什麼它很難SH?

它崩潰,因爲UIViewController的presentViewController:animated:completion:方法在iOS 4.3上不可用。它是在iOS 5中引入的,您的代碼最有可能設置爲iOS < 5.0 - 因此崩潰 - QED

+0

我也試過這也導致了'SIGABRT'錯誤以及 – Besi 2012-04-23 12:27:28

+0

ok,讓我們試試這個,把你的目標改成ios 5並運行 - 就像現實檢查一樣。如果這仍然崩潰,您需要發佈更多的代碼,因爲我認爲問題位於其他地方。儘管如此,我仍然可以證實我的原始答案適用於我剛剛完成的測試項目。 – chewy 2012-04-23 12:31:30

+0

目標已經設置爲5.0,另外如果我使用傳統方式呈現模態視圖控制器,則會發生同樣的錯誤。 – Besi 2012-04-23 12:47:08

2

在4.0中引入了塊,因此如果在具有較低iOS的設備上使用塊,您將收到SIGABRT。 使用respondsToSelector和後備方法檢查它是否存在。

if([self respondsToSelector:@selector(presentViewController:animated:completion:)]){ 
     [self presentViewController:nav animated:YES completion:^{}]; 
}else{ 
    [self presentModalViewController:nav animated:YES]; 
} 
+0

使用傳統方式時也會出現問題。我相應地更新了我的答案。 – Besi 2012-04-23 12:43:57

1

如果你正在運行在iOS 4.x的模擬器應用程序,它會與因NSInvalidArgumentException SIGABRT之類的東西unrecognized selector sent崩潰。原因是presentModalViewController:animated:completion:在iOS 5.0之前不存在。

以前版本的iOS使用presentModalViewController:animated:。由於在安裝iOS 5.0不贊成使用它標記,也可以爲今後修的做到這一點:

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) { 
    [self presentViewController:nav animated:YES completion:^{}]; 
} else { 
    [self presentModalViewController:nav animated:YES]; 
} 

更多信息請參見UIViewController Class Reference

+0

問題也出現在顯示模態的傳統方式中。我相應地更新了我的答案。 – Besi 2012-04-23 12:46:25

+0

Xcode控制檯中的其他錯誤信息可能有助於找到根本原因。 – Hailei 2012-04-23 12:49:24

+0

不幸的不是。該程序只是跳到'main'函數,並說'線程1:程序接收到的信號:'SIGABRT''。這就是我所得到的:-( – Besi 2012-04-23 12:53:32