委任を使用することをお勧めします。vcBでプロパティを宣言し、vcAをデリゲートとして設定します。このようにして、さまざまな状態の変化を現在のUIViewControllerに伝達できます。
最初にプロトコル宣言を行い、デリゲートプロパティを宣言します。
// ViewControllerB.h
@class ViewControllerB;
@protocol ViewControllerBDelegate <NSObject>
- (void)viewControllerDidClose:(ViewControllerB *)viewController;
@end
@property (unsafe_unretained, nonatomic) id<ViewControllerBDelegate> delegate;
次に、特定のイベントが発生したときにデリゲートを呼び出します。受信オブジェクトがプロトコルを実装していることを確認してください。
// ViewControllerB.m
- (IBAction)closeButtonTapped:(id)sender
{
if ([self.delegate respondsToSelector:@selector(viewControllerDidClose:)]) {
[self.delegate viewControllerDidClose:self];
}
}
次に、プロトコルをvcAに実装します。
// ViewControllerA.h
@interface ViewControllerA : UIViewController <ViewControllerBDelegate>
vcAをvcBのデリゲートとして設定します。
// ViewControllerA.m
- (void)presentVcB {
vcB = [[ViewControllerB alloc] initWithNibName:nil bundle:nil];
vcB.delegate = self;
[self presentModalViewController:vcB animated:YES];
}
そして、メソッドが呼び出されたときにそれに応じて応答します。
// Implementing ViewControllerBDelegate
- viewControllerDidClose:(ViewControllerB *)viewController {
[self dismissModalViewControllerAnimated:YES];
}
このパターンは、モーダルビューを閉じるだけでなく、さまざまな目的に使用できることに注意してください。