presentViewController 导致崩溃

Posted

技术标签:

【中文标题】presentViewController 导致崩溃【英文标题】:presentViewController causing crash 【发布时间】:2013-04-08 02:46:22 【问题描述】:

我正在使用 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 调用时崩溃了,但我很难找出我做错了什么,因为所有教程和 *** 答案都使用了已弃用的模态函数调用!我怀疑我只是在我以前的代码中做各种疯狂的 BS?无论哪种方式,我都不知道如何让我的代码工作。

很多代码都是从堆栈溢出中收集的,所以我不能保证其中任何一个的敏感性 - 我对 ios 编码非常陌生,基本上被投入到这个项目中,我们只是想让它起作用。请帮忙!

【问题讨论】:

【参考方案1】:

是的,这里似乎有些不对劲。为了在您实例化 UIImagePickerController 时实现您所追求的目标,您通常希望当前视图控制器呈现您的图像选择器实例。发生崩溃是因为:

    您是在告诉图像选择器呈现来自 Cocos2D 的内容 UIImagePickerController 视图甚至还没有出现在屏幕上

您可以访问视图控制器吗?

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

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

其中selfUIViewController 的某个子类。

希望这会有所帮助!

【讨论】:

有道理...我认为 sharedDirector 是 UIViewController 的子类,所以我想将它用作视图控制器。但是,我知道我不能只使用 self 而不是 imagePicker,因为这是 CCLayerColor 的子类(如果我尝试,xcode 会对我大喊大叫)。我不知道我还能尝试什么? 别等了。我交换了 [CCDirector sharedDirector] 和 imagePicker 并且它可以工作......现在我得到了这个错误:2013-04-07 20:05:31.678 prototype1[23030:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController' 我知道这意味着什么 T.T 谢谢你的帮助! 如果您还有任何问题,请告诉我。随着 Cocos 和 UIKit 的结合,事情变得过于复杂:-) 好吧,现在我正试图让它使用 UIPopoverController 的东西......我收到了一个 reason: 'The content view controller argument must be the root of its associated view controller hierarchy. 错误与此调用:[imagePicker presentPopoverFromRect:CGRectMake(10, 10, size.width-20, size.height-20) inView:[CCDirector sharedDirector].view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 任何线索如何解决?答案可能真的很明显,在这一点上我有点醉意和困惑...... 只是想添加一个更新,我想我已经掌握了一切(好吧,无论如何,现在调试不同的崩溃>. 【参考方案2】:

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

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

【讨论】:

【参考方案3】:

还有一件事,在设置之前

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
 
 //.....
   

【讨论】:

谢谢!我知道那个,不过,我在代码中有一个注释可以把它放进去,我终于解决了它<.>

以上是关于presentViewController 导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

presentViewController 导致崩溃

将另一个类的视图添加为 presentViewController 会导致 UIEvents 不起作用

10-多写一个@Autowired导致程序崩了

presentViewController over TabBarController 导致“尝试在其视图不在窗口层次结构中的 TabBarVC 上呈现 *VC”

IIViewDeckController 和 presentViewController

update 没有索引导致业务崩了,老板骂了一个小时