1

正常に動作するUIImagePickerControllerをロードするための次のコードがあります。

    UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
    mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
    mediaUI.delegate = self;
    [controller presentModalViewController: mediaUI animated: YES];
    return YES;

UIImagePickerControllerの使用方法に関するヘルプ情報を含むモーダルビューをロードしたいと思います。

UIStoryboard *storyboard = self.storyboard;
HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"];
[self presentViewController:svc animated:YES completion:nil];

ユーザーがHelpViewControllerビューを閉じた後、UIImagePickerControllerを表示するにはどうすればよいですか?

4

1 に答える 1

3

HelpViewControllerからUIImagePickerControllerに直接移動しようとしないでください。mainViewControllerを介してそこに移動する必要があります。

コードをメソッドに入れましょう...

- (void) presentImagePicker {
    UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
    mediaUI.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    mediaUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeMovie, nil];
    mediaUI.delegate = self;
    [controller presentModalViewController: mediaUI animated: YES];
    return YES;
}

(これpresentModalViewController:animatedは〜iOS5以降廃止されていることに注意してください。実際には、に置き換える必要があります [controller presentViewController:mediaUI animated:YES completion:nil];

mainVCviewControllers 、helpVCおよびを呼び出しましょうimageVC。これを実装する方法は2つあります。

メソッド1-performSelector

すばやく少し汚い解決策は、helpVCのボタンを閉じる方法でこれを行うことです。

- (IBAction)dismissHelpAndPresentImagePicker:(id)sender 
{
    UIViewController* mainVC = self.presentingViewController;
    [mainVC dismissViewControllerAnimated:NO completion:
     ^{
         if ([mainVC respondsToSelector:@selector(presentImagePicker)])
         [mainVC performSelector:@selector(presentImagePicker)];
     }];
}

で実装されていることを確認する必要があるため、少し汚れています。presentImagePicker実装されmainVCていない場合、コンパイラは警告を表示しません。また、オブジェクトが却下された後に完了ブロックを実行しているため、それが機能するかどうかは定かではありません(実際には、機能しますが、それでも...)

ポインタself.presentingViewControllerをローカル変数()に割り当てる必要あることに注意してくださいmainVC。これhelpVCは、が却下されると、そのpresentingViewControllerプロパティがnilにリセットされるため、完了ブロックを実行するまでに使用できなくなるためです。ただし、ローカル変数mainVCは引き続き有効です。

方法2-プロトコル/デリゲート

これを行うためのクリーンな方法は、helpVCのプロトコルを使用してデリゲートメソッドを宣言し、mainVCをデリゲートにすることです。このようにして、コンパイラはすべてを追跡し、正しく実装されていない場合は警告を発します。

これを行う手順は次のとおりです。

helpVC.hで、@interfaceセクションの上に次のプロトコルを追加します。

@protocol helpVCDelegate
    - (void) dismissHelpAndPresentImagePicker;
@end

helpVC.hインターフェイスセクションで、デリゲートのプロパティを宣言します。

@property (nonatomic, weak) id <helpVCDelegate> delegate;

(は <helpVCDelegate>、デリゲートがプロトコルに準拠することが期待されていることをコンパイラに通知するため、実装する必要がありますdismissHelpAndPresentImagePicker

helpVC.mでは、メソッドは次のようになります。

- (IBAction)dismissHelpAndPresentImagePicker:(id)sender 
{
    [self.delegate dismissHelpAndPresentImagePicker];
}

MainVCで、HelpVC(コードでは= svc)を作成するときに、MainVCをデリゲートとして設定します。

HelpViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"HelpViewController"];
svc.delegate = self;
[self presentViewController:svc animated:YES completion:nil];

そして、必ずデリゲートメソッドを実装してくださいdismissHelpAndPresentImagePicker

- (void) dismissHelpAndPresentImagePicker
{
    [self dismissViewControllerAnimated:NO completion:^{
           [self presentImagePicker];
         }];

}

個人的には、常に方法2を使用します。しかし、今日、同様の質問に対してその解決策を提案しました。質問者は、プロトコル/デリゲートが複雑すぎると考えているようでした。たぶん私の答えはそれをそう思わせたのかもしれません、私はここでそれを単純化しようとしました。

于 2013-02-18T02:35:56.727 に答える