如何在viewDidLoad中启动iPhone相机?

4

当加载我的视图时,我似乎无法启动相机。最终用户必须找到并按下屏幕上的按钮才能加载相机(冗余)。我该怎么做?代码如下:

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {

    self.imgPicker = [[UIImagePickerController alloc] init];
    self.imgPicker.allowsImageEditing = NO;
    self.imgPicker.delegate = self;
    self.imgPicker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [super viewDidLoad];

    [self presentModalViewController:self.imgPicker animated:YES];

}

更新:
将上述代码放入-viewDidAppear:(BOOL)animated中允许启动相机,但应用程序随即崩溃,最后一次例程是[UIWindowController transitionViewDidComplete:fromView:toView];(由调试器引用)

2个回答

4
如果第一个方法不起作用,那么你应该在viewWillAppear:或viewDidAppear:中执行它。在viewDidLoad中尝试执行它是行不通的,因为那是在视图首次创建之后调用的,而此时视图还不是任何其他视图的子视图。据我所知,为了在self上调用presentModalViewController,视图必须在UIWindow中某个级别上显示。
我还注意到另一件事;根据你如何声明imgPicker属性,你的代码会泄露内存。如果使用retain而不是assign进行声明,那么除非你在某个地方显式释放两次,否则picker将始终存在于内存中。在这种情况下,你应该在将其分配给属性时自动释放初始化的对象。

更新:- (void)viewDidAppear:(BOOL)animated在这种情况下可行。谢谢! - RexOnRoids
更新2:相机正在显示,但我的应用程序会退出,并显示“错误EXC_BAD_ACCESS”。 - RexOnRoids
不,通常我不会在调用视图控制器的dealloc之前释放相机,而且为了确保,我注释掉了所有的释放语句来检查这个错误,但似乎与此无关。 - RexOnRoids
很奇怪,我唯一能想到的是你释放/自动释放了某个东西太多次;仔细检查你的代码,确保你分配的所有内容都在相同的范围内被释放/自动释放一次。 - Kevlar
找不到解决方案。最后我只能使用一个按钮来启动相机了。不想在一个难以捉摸却微不足道的问题上浪费太多时间。不过还是感谢你的帮助。 - RexOnRoids
显示剩余3条评论

0

看起来当你在viewDidLoad中调用present modal view时,它不会执行。你可以尝试在调用[super viewDidLoad]后设置一个2秒的定时器,然后再推入picker view或者类似的操作。


1
一个计时器并不能解决这个问题;在控制器中创建视图和显示视图之间可能会超过两秒钟的时间,这种情况下调用仍然无法生效。 - Kevlar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接