呈现Modal ViewController导致SIGABRT

时间:2012-04-23 12:07:08

标签: objective-c ios xcode ipad sigabrt

我使用自定义UINavigationController子类初始化UIViewController。但是只要我想呈现视图控制器,我就会在Xcode中出现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

4 个答案:

答案 0 :(得分:4)

问题是由于我的ViewController中的Outlet错误引起的。我无法理解,因为编译器从未告诉我这一点。只有当我在视图控制器的演示文稿周围添加try / catch时,我才得到异常对象,最后告诉我出了什么问题。对不起,感谢您的帮助。

答案 1 :(得分: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];
}

答案 2 :(得分:1)

如果您在iOS 4.x模拟器上运行该应用程序,由于NSInvalidArgumentExceptionunrecognized selector sent之类的问题,它将因SIGABRT而崩溃。原因是iOS 5.0之前不存在presentModalViewController:animated:completion:

对以前版本的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

答案 3 :(得分:0)

答案很简单,删除块代码并将最后一行添加到

[self presentModalViewController:nav animated:YES];
在Nav中

,您可以使用ViewDidLoad

执行任何其他代码

为什么会崩溃?

崩溃是因为iOS 4.3上没有UIViewController的presentViewController:animated:completion:方法。它是在iOS 5中引入的,您的代码很可能是针对iOS< 5.0 - 因此崩溃 - QED