UIImagepickerController [takepicture] модальное представление исчезает без обратного вызова делегата - PullRequest
1 голос
/ 11 ноября 2009

Обновление:

На этот вопрос ответили. Это была моя собственная глупость, возможно, не стоит больше читать этот вопрос. лол.

Вопрос:

Правильно, поэтому у меня есть этот подкласс UIViewController (master), у него есть UIImagepickerController (камера), у него также есть UIView (overlayView). Мастер настраивает камеру для настройки в качестве камеры только с пользовательским оверлеем cameraOver, скрывая пользовательские элементы управления 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]; 

    }

После некоторой помощи от людей в ответах я могу сказать, что камера не выпускается.

Мне также удалось остановить exec_bad_access, не давая ему повторно вызывать [presentmodal ....], проверяя значение bool в методе viewDidAppear.

У меня все еще есть проблема, когда модальное представление исчезает, любая помощь, снова lol ??

Ответы [ 3 ]

2 голосов
/ 11 ноября 2009

Я думаю, что вам не хватает camera.delegate = self;

1 голос
/ 11 ноября 2009

Для любых ошибок EXC_BAD_ACCESS вы обычно пытаетесь отправить сообщение освобожденному объекту. ЛУЧШИЙ способ отследить это - использовать NSZombieEnabled .

Это работает, никогда не выпуская объект, а заключая его в «зомби» и устанавливая внутри него флаг, который говорит, что обычно он был бы выпущен. Таким образом, если вы попытаетесь снова получить к нему доступ, он все еще будет знать, что было до того, как вы допустили ошибку, и с помощью этой небольшой информации вы обычно можете вернуться назад, чтобы увидеть, в чем проблема.

Это особенно помогает в фоновых потоках, когда отладчик иногда выбрасывает любую полезную информацию.

ОЧЕНЬ ВАЖНО ЗАМЕЧАНИЕ однако, вам нужно на 100% убедиться, что это только в вашем отладочном коде, а не в коде дистрибутива. Поскольку ничего не выпущено, ваше приложение будет течь и течь и течь. Чтобы напомнить мне сделать это, я поместил этот журнал в моем appdelegate:

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

Если вам нужна помощь в поиске точной строки, выполните Build-and-Debug (CMD-Y) вместо Build-and-Run (CMD-R). Когда приложение падает, отладчик покажет вам, какая именно строка и в сочетании с NSZombieEnabled, вы сможете точно узнать, почему.

0 голосов
/ 11 ноября 2009

Проверьте значение переменной-члена camera, прежде чем пытаться отобразить его:

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

Я подозреваю, что он может быть выпущен где-то, но, поскольку coneybeare NSZombieEnabled позволит вам отследить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...