UIImagepickerController [takepicture]模态视图消失没有委托回调

时间:2009-11-10 22:13:33

标签: iphone camera uiimagepickercontroller viewdidappear

更新:

已经回答了这个问题。这是我自己的愚蠢,可能不值得再读这个问题了。洛尔。

问题:

对,所以我有这个UIViewController(主)子类,它有一个UIImagepickerController(摄像头),它还有一个UIView(overlayView)。 Master将相机配置为仅使用自定义cameraOverlay配置为相机,隐藏自定义控件e.t.c.

除了我尝试以编程方式拍照时,所有内容似乎都能正常工作。接下来发生的事情是overlayView调用主控器,这会触发拍摄照片,然后我听到快门声音并且光圈关闭,相机似乎解散了自己(我在我的代码中反而没有这样做)然后我的viewDidAppear被调用我的主人了。

有人知道最新情况吗?

    -(void)viewDidLoad
{
    NSLog(@"loading the view");
    //if the camera is on the device
    if ( [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    {
        //make one
        camera = [[UIImagePickerController alloc] init];
        //setup some settings that we need
        camera.sourceType = UIImagePickerControllerSourceTypeCamera;
        camera.showsCameraControls = NO;
        camera.navigationBarHidden = NO;
        camera.toolbarHidden = YES;
        camera.cameraViewTransform = CGAffineTransformScale(camera.cameraViewTransform, 1.03, 1.03);
        //show it
        overlayView = [[OverlayView alloc] initWithFrame:CGRectMake(0,0,320,480) withDelegate:self andController:self];
        camera.cameraOverlayView = overlayView;
            camerashowing=NO;

    }
    else 
    {
        alert = [[UIAlertView alloc] initWithTitle:@"No Camera Detected" message:@"The camera is broken or your device has no camera. Please close the application" delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
        [alert show];
        [alert release];
    }
}

-(void)viewDidAppear:(BOOL)animated
{
  if (!cameraShowing)
  {
    NSLog(@"going to show camera");
    [self presentModalViewController:camera animated:NO];
    camerashowing = YES;
  }
}



 -(void)releaseShutter
  { 
    [overlayView toolbarShowWarning];
    NSLog(@"going to show camera: %@", self);
    [camera takePicture]; 

    }

经过一些人的帮助建议后,我可以说相机没有被释放。

我还设法通过检查viewDidAppear方法中的bool值来阻止exec_bad_access第二次调用[presentmodal ....]。

我仍有问题,模态视图消失,任何帮助,再次大声笑??

3 个答案:

答案 0 :(得分:2)

我认为你错过了camera.delegate = self;

答案 1 :(得分:1)

对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。跟踪这些内容的 BEST 方式是使用NSZombieEnabled

这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。

当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。

非常重要注意但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

如果您需要帮助查找确切的行,请执行构建和调试(CMD-Y)而不是构建并运行(CMD-R)。当应用程序崩溃时,调试器会向您显示确切的行,并与NSZombieEnabled结合使用,您应该能够确切地找到原因。

答案 2 :(得分:0)

在尝试显示之前检查camera成员变量的值:

NSLog(@"going to show camera: %@", camera);

我怀疑它可能会被释放到某个地方,但是因为它可以让你跟踪NSZombieEnabled。