在View Controller生命周期中呈现UIImagePickerController?

时间:2014-01-27 05:21:54

标签: ios iphone uiviewcontroller uiimagepickercontroller modalviewcontroller

当用户在我的应用中的相机标签上标记以拍摄照片时,我想立即呈现UIImagePickerController(类似于许多照片拍摄应用程序,如Instagram等)。目前,我有一个名为CameraViewController的VC,它显示从UIImagePickerController获取的图片,并在viewWillAppear CameraViewController函数中显示ImagePickerController 模态当我发现没有拍摄照片时。

虽然这在大部分时间都有用,但我注意到有时我会得到例外说法:

“因未捕获的异常而终止应用程序'NSInvalidArgumentException',原因:'应用程序尝试以模态方式呈现活动控制器。”

根据这里提出的一些SO问题的建议,我也尝试在viewDidAppear中展示控制器。但是,对于viewDidAppear,模态ImagePicker永远不会被解雇,并且我不断收到错误“对开始/结束外观转换的不平衡调用。”

我的问题是:

  1. 我目前正在以模态方式呈现ImagePickerController以供用户拍照,然后在拍摄照片后将其解除。这通常是ImagePickerControllers最可靠/最无问题的完成方式。
  2. 我还应该考虑在视图生命周期中放置ImagePickerController以获得所需的效果吗?
  3. 这是我的代码:

    viewWillAppear

    中的

    BOOL modalPresent = (BOOL)(self.presentedViewController);
    if (!appDelegate.imageStorageDictionary[@"picture1"]){
        if (modalPresent == NO){
            [self presentViewController:self.imagePickerController animated:NO completion:nil];
        }
    }
    
    imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

    中的

    //Other lines omitted 
    if (![[self imagePickerController] isBeingDismissed]) 
        [self dismissViewControllerAnimated:NO completion:nil];
    

1 个答案:

答案 0 :(得分:1)

我对你关于-viewWillAppear的问题并没有太多了解,但有一件事你必须知道-viewWillAppear会被多次召唤。原因是,第一个电话会在您加载viewControllerviewDidLoad时出现并且会照常调用,其次是当您提出modalViewController (imagePickerController)时再次被解除时viewWillAppear if([UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { if(myPicker) { [myPicker release]; myPicker = nil; } myPicker = [[UIImagePickerController alloc] init]; [self presentViewController:myPicker animated:YES completion:NULL]; } else { UIAlertView *altnot=[[UIAlertView alloc]initWithTitle:@"Camera Not Available" message:@"Camera Not Available" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]; altnot.tag=103; [altnot show]; [altnot release]; } 将调用1}}因为viewController的视图即将出现..

其次,当用户点击相机按钮时,您想要当前相机的功能,请执行以下操作:

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
    if(myPicker)
    {
       [myPicker release];
       myPicker = nil;
    }
    myPicker          = [[UIImagePickerController alloc] init];
    myPicker.delegate = self;
    myPicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

    myPicker.allowsEditing = NO;

}
[self presentViewController:myPicker animated:YES completion:NULL];

用于挑选已捕获的图像..

- (无效)ChooseAlreadyCapturedPhoto {

imagePicker-controller

}

注意:我每次使用时都释放了以前分配的选择对象,但没有必要。您可以使用我的选择器的唯一单个实例,不要标记错误。在viewController里面使用{{1}}绝对没问题,它不会有害。如果你提出并解雇modalViewController一个没有。时间,然后每次你解雇时都会调用viewWill。