1

UINavigationController我用我的自定义子类初始化一个UIViewController。但是只要我想展示视图控制器,我就会SIGABRT在 Xcode 中得到一个错误。我以前做过很多次,我认为这个问题的存在是因为在我当前的项目中可能不正确的其他事情。但是,我发现很难找到这种现象背后的问题。那么有没有一些你可以做的事情以某种方式阻止模态视图控制器的呈现?

这就是我展示我的视图控制器的方式:

- (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

4 回答 4

3

该问题是由于我的 ViewController 中的 Outlet 错误引起的。我无法弄清楚,因为编译器从未告诉我这一点。只有当我try / catch在视图控制器的表示周围添加了一个时,我才得到异常对象,它最终告诉我出了什么问题。很抱歉造成混乱,感谢您的帮助。

于 2012-04-23T13:49:35.203 回答
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];
}
于 2012-04-23T12:31:03.427 回答
1

如果您在 iOS 4.x 模拟器上运行该应用程序,它将与 SIGABRT 一起崩溃,NSInvalidArgumentException因为unrecognized selector sent. 原因是presentModalViewController:animated:completion:在 iOS 5.0 之前不存在。

用于presentModalViewController:animated:以前版本的 iOS。由于它在 iOS 5.0 中被标记为已弃用,因此您可以这样做以供将来维护:

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

有关详细信息,请参阅UIViewController 类参考

于 2012-04-23T12:36:42.887 回答
0

答案很简单,删除块代码并将最后一行更改为

[self presentModalViewController:nav animated:YES];

在 Nav 中,您可以使用 ViewDidLoad 执行任何其他代码

为什么会崩溃?

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

于 2012-04-23T12:26:14.743 回答