0

過去2日間これを試してきましたが、答えがわかりません。私はすべてを検索しましたが、答えは見つかりませんでした。

質問は、アプリでカメラを起動するボタンがあることです (写真のみを撮るため)。カメラは開きますが、写真を撮って右下に表示されている「USE」をクリックするとクラッシュします。また、カメラが開くと、写真を撮る前に「キャンセル」をクリックすると再びクラッシュします。

ブレークポイントを使用してみましたが、「USE」ボタンをクリックすると、この行でクラッシュすることがわかりました

[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以下で使用する必要があります。

ドキュメントのメソッドの説明を見てください。

受信者によって提示されたビュー コントローラーを閉じます。

表示側のビュー コントローラーは、表示されたビュー コントローラーを閉じる役割を果たします。ただし、提示されたView Controller自体でこのメソッドを呼び出すと、メッセージが提示元のView Controllerに自動的に転送されます

于 2013-05-23T10:30:19.273 に答える