0

过去两天我一直在尝试这个,但我无法找出答案。我已经搜索了所有内容,但没有找到答案。

问题是我有一个按钮,可以在我的应用程序中调出相机(仅用于拍照)。相机打开了,但是当我拍照并单击“使用” (显示在右下角)时,它崩溃了。此外,当相机打开时,在我点击“取消”拍照之前,它再次崩溃。

我尝试使用断点并发现,当我单击“使用”按钮时,它会在这一行崩溃

[picker dismissViewControllerAnimated:YES completion:Nil]

我正在我的 iPad (iOS6) 上测试它。

这是此处的按钮代码

-(IBAction)getAlbum:(id)sender {

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        NSArray *media = [UIImagePickerController
                          availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera];

        if ([media containsObject:(NSString*)kUTTypeImage] == YES) {
            UIImagePickerController *picker = [[UIImagePickerController alloc] init];
            picker.sourceType = UIImagePickerControllerSourceTypeCamera;
            //picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
            [picker setMediaTypes:[NSArray arrayWithObject:(NSString *)kUTTypeImage]];

            picker.delegate = self;
            //[self presentModalViewController:picker animated:YES]; //Since [Modal](http://stackoverflow.com/questions/12445190/dismissmodalviewcontrolleranimated-deprecated) has been removed
            [self presentViewController:picker animated:YES completion:Nil];
            //[picker release];

        }
        else {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unsupported!"
                                                            message:@"Camera does not support photo capturing."
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
            [alert release];
        }

    }
    else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unavailable!"
                                                        message:@"This device does not have a camera."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];
    }


}

imagePickerController 方法在这里:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSLog(@"Media Info: %@", info);
    NSString *mediaType = [info valueForKey:UIImagePickerControllerMediaType];

    if([mediaType isEqualToString:(NSString*)kUTTypeImage]) {
        UIImage *photoTaken = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

        //Save Photo to library only if it wasnt already saved i.e. its just been taken
        if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
            UIImageWriteToSavedPhotosAlbum(photoTaken, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
        }


        selectedLogoImg.image=photoTaken; //selectedLogoImg is the imageView
        [self.clipartItemView addSubview:selectedLogoImg]; // To detect touch and move it I place it as a subview of self.clipartItemView
    }

    //[picker dismissModalViewControllerAnimated:YES];
    [picker dismissViewControllerAnimated:YES completion:Nil]
    //[picker release];
    //[picker dismissViewControllerAnimated:YES completion:^{
      //  NSLog(@"Dismiss completed");
    //}];
}

didFinishSavingWithError 代码在这里:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    UIAlertView *alert;
    //NSLog(@"Image:%@", image);
    if (error) {
        alert = [[UIAlertView alloc] initWithTitle:@"Error!"
                                           message:[error localizedDescription]
                                          delegate:nil
                                 cancelButtonTitle:@"OK"
                                 otherButtonTitles:nil];
        [alert show];
        [alert release];
    }

}

imagePickerControllerDidCancel 代码在这里:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    //[picker dismissModalViewControllerAnimated:YES];
    /*[picker dismissViewControllerAnimated:YES completion:^{
        [self.view sendSubviewToBack:cardGalleryView];
    }];*/
    [picker dismissViewControllerAnimated:YES completion:Nil];

}
4

2 回答 2

1

您应该将dismissViewControllerAnimated:completion: 消息发送到视图控制器,而不是选择器。尝试:

[self dismissViewControllerAnimated:YES completion:nil];

以上方法仅适用于iOS 6 [self dismissModalViewControllerAnimated:YES],iOS 5及以下需要使用。

看一下文档中对方法的描述:

关闭接收者呈现的视图控制器。

呈现视图控制器负责关闭它呈现的视图控制器。但是,如果您在呈现的视图控制器本身上调用此方法,它会自动将消息转发到呈现的视图控制器

于 2013-05-23T10:30:19.273 回答
0

这个问题是由于你的UIImagePickerController *picker对象。ViewController 无法在getAlbum方法范围之外识别您的选取器对象引用。

1.> 你可以在你的文件中创建UIImagePickerController对象.h

 @interface yourViewController : UIViewController <UIImagePickerControllerDelegate,UINavigationControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate>
{

   UIImagePickerController *picker;
   UIPopoverController *popover;
} 

.m文件中,您只需在getAlbum IBAction方法中使用它

-(IBAction)getAlbum:(id)sender {

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
    NSArray *media = [UIImagePickerController
                      availableMediaTypesForSourceType: UIImagePickerControllerSourceTypeCamera];

    if ([media containsObject:(NSString*)kUTTypeImage] == YES) {

         UIButton *btn=(UIButton *)sender;
         if ([popover isPopoverVisible])
         {
              [popover dismissPopoverAnimated:YES];
              popover=nil;
         }
         picker = [[UIImagePickerController alloc]init];
         picker.sourceType = UIImagePickerControllerSourceTypeCamera;
         [picker setMediaTypes:[NSArray arrayWithObject:(NSString *)kUTTypeImage]];
         picker.delegate = self;

        popover = [[UIPopoverController alloc] initWithContentViewController:picker];
        [popover presentPopoverFromRect:CGRectMake(btn.frame.size.width,btn.frame.size.height/2,1,1) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

    }
    else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unsupported!"
                                                        message:@"Camera does not support photo capturing."
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
        [alert show];
        [alert release];
    }

 }
 else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Unavailable!"
                                                    message:@"This device does not have a camera."
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
 }
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)myimage editingInfo:(NSDictionary *)editingInfo
{
    myimage = [myimage fixOrientation];

    [picker dismissModalViewControllerAnimated:YES];
    [popover dismissPopoverAnimated:YES];
}

我希望它可以帮助您更好地理解。

于 2013-05-23T10:52:59.710 回答