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];
)
mainVC
viewControllers 、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を使用します。しかし、今日、同様の質問に対してその解決策を提案しました。質問者は、プロトコル/デリゲートが複雑すぎると考えているようでした。たぶん私の答えはそれをそう思わせたのかもしれません、私はここでそれを単純化しようとしました。