Black screen appears, randomly after taking an image and tapping 'USE' in the UIImagePickerController

I have an app that's almost done and now while it was under QA, the QA engineer came across a random issue in which a black screen appears after tapping on USE in UIImagePickerController view. Further in didFinishPickingMediaWithInfo the image is being saved for future refrencing and is being shown in an UIImageView, I am also using camera overlay for adding a button to the UIImagePickerView and the max memory usage of the app doen't goes beyond 13 MB. The issue is not arising when switching to Camera roll mode from capture mode. Also in the same view iADs are being presented. Underneath is the code, to which the issue may concern, also images are being attached to get an idea of the issue. Any help would be greatly appreciated.

Thanks in advance.

(void) launchCamera 
{
     // Set up the camera\
     CustomCameraView *cameraController   = [[CustomCameraView alloc] init];  
     cameraController.sourceType          = UIImagePickerControllerSourceTypeCamera;
     cameraController.delegate            = self; 
     cameraController.showsCameraControls = YES;
     cameraController.navigationBarHidden = YES;
     cameraController.toolbarHidden       = YES;

     // overlay on top of camera lens view

     UIButton *cameraRoll = [[UIButton alloc] initWithFrame:CGRectMake(15, 380, 40, 40)];
     [cameraRoll setAlpha:0.0f];
     [cameraRoll setBackgroundImage:[UIImage imageNamed:@"CamerRoll_New"] forState:UIControlStateNormal];
     [cameraRoll addTarget:self action:@selector(switchToCameraRoll) forControlEvents:UIControlEventTouchUpInside];
     cameraController.cameraOverlayView = cameraRoll;

     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDelay:1.5f];
     cameraRoll.alpha = 1.0f;
     [UIView commitAnimations];

     [self presentModalViewController:cameraController animated:YES];

 }

-(void)switchToCameraRoll
{
    DLog(@"Camera Roll");  
    [self dismissViewControllerAnimated:NO completion:^(void){ [self photoSourcePhotoAlbum];}];
}

-(void) photoSourcePhotoAlbum
{
     UIImagePickerController * picker = [[UIImagePickerController alloc] init];
     picker.delegate = self;
     picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
     [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{    
    [self.view addSubview:progressView];
    timer = [NSTimer scheduledTimerWithTimeInterval:.017 target:self selector:@selector(progressChange) userInfo:nil repeats:YES];
    [picker dismissModalViewControllerAnimated:YES];
    [self performSelectorInBackground:@selector(saveImage:) withObject:info];
    [self performSelector:@selector(navigateToEditView) withObject:nil afterDelay:2.1];
}

-(void)navigateToEditView
{
    [self performSegueWithIdentifier:@"presentRDetailModalViewController" sender:self];   
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    if (picker.sourceType == UIImagePickerControllerSourceTypeSavedPhotosAlbum) 
    {
        [picker dismissViewControllerAnimated:NO completion:^(void){ [self photoSourceCamera];}];
    }
    else 
    {
        [picker dismissModalViewControllerAnimated:YES]; 
    }
}

-(void)saveImage:(NSDictionary *)info
{    
    NSString *imageName = [[[DataStaging dataStaging] getGUID] stringByAppendingString:@".jpg"];
    rImageName = imageName;
    UIImage *rImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

    //Compress image

    [[FileOperations fileOperations] PersistData:UIImageJPEGRepresentation(rImage, 0.4) name:imageName];
    DLog(@"%@",[[FileOperations fileOperations] fetchPath:imageName]);

    //Actual image taken

    [[self rImageView] setImage:[info objectForKey:@"UIImagePickerControllerOriginalImage"]];

    if ([rImageName length] == 0) 
    {
        [[self rDetails] setHidden:YES];
        [[self trashRImage]   setHidden:YES];
    }
    else 
    {
        [[self rDetails] setHidden:NO];

        [[self trashRImage]   setHidden:NO];
    }

    [progressView removeFromSuperview];
  }
}

Answers


Make sure you don't call presentModalViewController:animated: twice before dismissModalViewControllerAnimated: It helped in my case.

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    if (_imagePickerController!=nil || _imagePopoverController!=nil) {
        return;
    }
    _imagePickerController = [[[UIImagePickerController alloc] init] autorelease];
    _imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
    _imagePickerController.sourceType = sourceType;
    _imagePickerController.delegate = self;
    switch (sourceType) {
        case UIImagePickerControllerSourceTypeCamera:
            _imagePickerController.showsCameraControls = YES;
            [self presentViewController:_imagePickerController animated:YES completion:nil];
            break;
        default:
            _imagePopoverController = [[UIPopoverController alloc] initWithContentViewController:_imagePickerController];
            _imagePopoverController.delegate = self;
            CGRect rect = [[UIScreen mainScreen] bounds];
            rect.origin.y = rect.size.height - 70.0;
            rect.size.height -= rect.origin.y;
            [_imagePopoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
            break;
    }
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker
{
    [_imagePopoverController dismissPopoverAnimated:YES];
    _imagePopoverController = nil;
    [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
    _imagePickerController = nil;
}

- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    UIImageWriteToSavedPhotosAlbum([info objectForKey:UIImagePickerControllerOriginalImage],nil,nil,nil);
    _currentImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    [_imagePopoverController dismissPopoverAnimated:YES];
    _imagePopoverController = nil;
    [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
    _imagePickerController = nil;
}

Need Your Help

Checking User's Organization in Liferay

liferay liferay-6 liferay-theme

So I have a Liferay (6.2) portal setup on my WebLogic 12c server, running just fine.