presentViewController导致崩溃

时间:2013-04-08 02:46:22

标签: ios objective-c ipad ios6

我正在使用cocos2d在iPad应用程序上工作,我正试图在库中选择图片或使用相机拍照,以便在应用程序中使用。昨天和今天我一直在谷歌上搜索疯狂,试图捏造一些东西去做上面的事情,但我应该首先承认我并不知道我在做什么。

我现在正在使用它的方式,你点击当前用户图像,它会弹出一个菜单,询问你是否要从相机或库中上传不同的图片。选择相机会调用以下内容(库版本基本相同):

- (void) onGetCameraImage
{
    UIImagePickerController* imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.allowsEditing = NO;

    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    [imagePicker presentViewController:[CCDirector sharedDirector] animated:YES completion:NULL];
}

当我尝试测试时(选择库,当然,因为模拟器不能做相机,是的,我打算实施没有相机的检查),我得到以下崩溃:

2013-04-07 19:21:50.248 prototype1[20897:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Application tried to present modally an active controller <UIImagePickerController: 0x9e87ac0>.'

我认为它在presentViewController调用时崩溃了,但是我正在努力找出我做错了什么,因为所有的教程和stackoverflow答案都使用了不推荐的模态函数调用!我怀疑我只是在我之前的代码中做各种疯狂的BS?无论哪种方式,我都不知道如何使我的代码工作。

很多这些代码都是从堆栈溢出中收集的,所以我无法保证其中任何一个的敏感性 - 我对iOS编码很新,基本上都投入到这个项目中,我们只是想尝试让它起作用。请帮忙!

3 个答案:

答案 0 :(得分:1)

这里似乎有些不对劲。为了实现在实例化UIImagePickerController时所需的内容,通常希望当前视图控制器显示图像选择器实例。崩溃正在发生,因为:

  1. 您告诉imagepicker提供来自Cocos2D的内容
  2. UIImagePickerController视图甚至不在屏幕上
  3. 您是否可以访问视图控制器?

    如果是这样,您可以执行以下操作:

    [self presentViewController:imagePicker animated:YES completion:nil];
    

    其中selfUIViewController的某个子类。

    希望这有帮助!

答案 1 :(得分:0)

只需更改最后一行,如下所示

 [imagePicker presentViewController: imagePicker animated:YES completion:nil];

答案 2 :(得分:-1)

还有一件事,在设置之前

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera

你必须检查源类型是否可用。

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
UIImagePickerController *imagePicker =
[[UIImagePickerController alloc] init];

imagePicker.delegate = self;

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

imagePicker.allowsEditing = YES;

[self presentModalViewController:imagePicker animated:YES];

[imagePicker release];

 }

 else
 {
 //.....
 }