【问题标题】:Presenting Modal ViewController leads to SIGABRT呈现 Modal ViewController 会导致 SIGABRT
【发布时间】:2012-04-23 12:07:07
【问题描述】:

我用我的自定义UIViewController 子类初始化UINavigationController。但只要我想展示视图控制器,我就会在 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

【问题讨论】:

  • 控制台中的内容是什么?
  • 能否在您的 Xcode 调试器控制台中提供详细的错误信息?如果应用程序以 SIGABRT 退出,则应该有一些关于异常的信息。如果您使用的是 iOS 4.x 模拟器,则一个可能的例外是 NSInvalidArgumentException
  • 可能问题是块(完成)是空的。尝试在其中放入一些虚拟代码(NSLog)。
  • @kuba 我用传统方法更新了我的答案,这也不起作用。
  • 这段代码属于什么类?它甚至是 UIViewController 吗?

标签: objective-c ios xcode ipad sigabrt


【解决方案1】:

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

【讨论】:

  • 这也是我的问题。这有多糟糕,xcode 无法警告错误的插座。我在 h 和 m 文件中重命名了 IBOutlet,但没有在 xib 文件中重命名......似乎应该跳转! :)
【解决方案2】:

Blocks 是在 4.0 中引入的,因此如果您在 iOS 较低的设备上使用 Blocks,您将收到 SIGABRT。 使用 respondsToSelector 和 fallback 方法检查它是否存在。

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

【讨论】:

  • 使用常规方式也会出现此问题。我相应地更新了我的答案。
【解决方案3】:

如果您在 iOS 4.x 模拟器上运行该应用程序,它会因为NSInvalidArgumentExceptionunrecognized selector sent 之类的原因而与 SIGABRT 一起崩溃。原因是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

【讨论】:

  • 传统的模态显示方式也会出现问题。我相应地更新了我的答案。
  • Xcode 控制台中的附加错误信息可能有助于找到根本原因。
  • 很遗憾没有。程序只是跳转到main 函数并说Thread 1: Program received signal: 'SIGABRT'。这就是我得到的全部:-(
  • 尝试在控制台输入bt并按回车键,看看它是否为您提供了一些跟踪信息?
  • 信息并不能说明异常是什么...我建议使用cocoadev.com/index.pl?DebuggingTechniques的“Breaking on Exceptions”部分中的方法打印异常对象。
【解决方案4】:

答案很简单,去掉块代码,把最后一行改成

[self presentModalViewController:nav animated:YES];

在导航中,您可以使用 ViewDidLoad 执行任何附加代码

为什么会崩溃?

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

【讨论】:

  • 好的,让我们试试这个,将你的目标更改为 ios 5 并运行 - 就像现实检查一样。如果这仍然崩溃,您将需要发布更多代码,因为我认为问题位于其他地方。尽管如此,我可以确认我的原始答案适用于我刚刚制作的测试项目。
  • 目标已经设置为 5.0 如果我使用传统方式呈现模态视图控制器,则会出现同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多