UIImagePickerController [takepicture] vista modal desaparece sem callback delegado

votos
1

Atualizar:

Esta foi respondida. Foi a minha própria estupidez, possivelmente, não vale a pena ler mais sobre esta questão. ri muito.

Questão:

Direita então eu tenho esta subclasse (master) UIViewController, tem uma UIImagePickerController (câmera), ele também tem um UIView (OverlayView). Mestre setups a câmara para ser configurado como uma câmara única com um cameraOverlay costume, escondendo os controlos personalizados etc

Tudo parece funcionar bem para além de quando eu tento tirar programaticamente uma imagem. O que acontece é o OverlayView chama o mestre e este aciona a imagem tomada, então eu ouvir o som do obturador eo diafragma fecha, a câmera parece descartar-se (i insolentemente não estou fazendo isso no meu código) e depois o meu viewDidAppear é chamado em meu mestre novamente.

Alguém tem alguma idéia o que está acontecendo?

    -(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]; 

    }

Depois de alguns conselhos a ajuda de pessoas nas respostas que eu posso dizer que a câmera não está sendo liberado.

Eu também conseguiu parar o exec_bad_access por ele parar de chamar [presentmodal ....] pela segunda vez, marcando um valor booleano no Método viewDidAppear.

Eu ainda tenho o problema onde os disapears vista modal, qualquer ajuda, novamente lol ??

Publicado 10/11/2009 em 23:13
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Eu acho que você está perdendo uma camera.delegate = self;

Respondeu 10/11/2009 em 23:49
fonte usuário

votos
1

Por quaisquer erros EXC_BAD_ACCESS, que normalmente são tentando enviar uma mensagem para um objeto lançado. A MELHOR maneira de controlar estes para baixo é usar NSZombieEnabled .

Isso funciona por nunca realmente liberar um objeto, mas por envolvê-lo como um "zumbi" e definindo um sinalizador dentro dela que diz que normalmente teria sido liberada. Dessa forma, se você tentar acessá-lo novamente, ele ainda sabia o que era antes de você cometeu o erro, e com este pouco de informação, normalmente você pode recuar para ver qual era o problema.

Ele ajuda especialmente em threads em segundo plano quando o depurador às vezes craps para fora em alguma informação útil.

Muito importante notar no entanto, é que você precisa de 100% certeza de que essa é apenas em seu código de depuração e não o seu código de distribuição. Porque nada é lançado, o aplicativo irá vazar e vazar e vazar. Para me lembrar de fazer isso, eu coloquei esse log no meu AppDelegate:

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

Se você precisar de ajuda para encontrar a linha exata, fazer uma compilação-and-Debug (CMD-Y) em vez de um Build-and-Run (CMD-R). Quando as falhas de aplicativos, o depurador irá mostrar-lhe exatamente qual linha e em combinação com NSZombieEnabled, você deve ser capaz de descobrir exatamente o porquê.

Respondeu 10/11/2009 em 23:27
fonte usuário

votos
0

Verifique o valor da cameravariável de membro antes de tentar e exibi-lo:

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

Eu suspeito que pode estar sendo lançado em algum lugar, mas como Coneybeare NSZombieEnabled vai deixar você segui-lo para baixo.

Respondeu 10/11/2009 em 23:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more