プロパティを使用して、View Controller の親にアクセスできますparentViewController
。
if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
SomeViewController* viewController = (SomeViewController*)self.parentViewController;
[viewController foo];
}
ただし、これはビュー コントローラー間の関係によって異なります。あなたの質問から、あなたは複数の子供と親子関係を持っていると推測しましたが、間違っていたら訂正してください! これは、View Controller が 1 つしか表示されず、ユーザーがすぐに注意を払う必要があるモーダル View Controller 表示とは大きく異なります。
説明:
UIViewControllerのparentViewController
とプロパティの違いについて混乱しているようです。presentingViewController
2 つの異なるビュー コントローラーの関係があり、それぞれがこれらのプロパティのいずれかに適用されます。
複数のビュー コントローラーのビューを親ビュー コントローラーのサブビューとして追加する場合は、ビュー コントローラー コンテインメントを使用します。この状況では、親ビュー コントローラーのサブビュー (子) として追加されたビューはいずれも、プロパティにアクセスすると、親ビュー コントローラー (子のスーパービュー、親ビューを制御する) を返しparentViewController
ます。この場合、presentingViewController
プロパティは を返しますnull
。
たとえば、親ビュー コントローラーでは次のようになります。
- (void)viewDidLoad {
[super viewDidLoad];
SomeViewController* someVC = [[SomeViewController alloc] init];
[self addChildViewController:someVC];
[self.view addSubview:someVC.view];
[someVC.view setFrame:<SOME_FRAME>];
[someVC didMoveToParentViewController:self];
AnotherViewController* anotherVC = [[AnotherViewController alloc] init];
[self addChildViewController:anotherVC];
[self.view addSubview:anotherVC.view];
[anotherVC.view setFrame:<ANOTHER_FRAME>];
[anotherVC didMoveToParentViewController:self];
/* this prints self */
NSLog(@"%@", someVC.parentViewController);
/* this prints null */
NSLog(@"%@", someVC.presentingViewController);
/* this prints self */
NSLog(@"%@", anotherVC.parentViewController);
/* this prints null */
NSLog(@"%@", anotherVC.presentingViewController);
}
反対に、単一のモーダル ビュー コントローラーを表示するだけの場合 (上記の一対多の親子関係よりも一般的な状況)、presentingViewController
プロパティが使用されます。
たとえば、表示側のビュー コントローラーでは次のようになります。
- (void)someActionTriggered {
SomeViewController* viewController = [[SomeViewController alloc] init];
[self presentViewController:viewController animated:YES completion:nil];
/* this prints null */
NSLog(@"%@", viewController.parentViewController);
/* this prints self, or a tab bar controller if 'self' is contained in one */
NSLog(@"%@", viewController.presentingViewController);
}
iOS でのモーダル ビュー コントローラー パターンの普及により、より一般的に見られる可能性がありますが、ビュー コントローラーを含むpresentingViewController
ビュー コントローラーの親子関係は完全に正当であり、UIViewController のプロパティparentViewController
とプロパティは iOS 5 の時点で廃止されていません。それらの使用法が変更されたばかりです。ドキュメントからのこの抜粋を読むことができます:childViewController
討論
受信者がコンテナ ビュー コントローラの子である場合、このプロパティはそれが含まれているビュー コントローラを保持します。受信者に親がない場合、このプロパティの値は nil です。
iOS 5.0 より前では、ビューに親ビュー コントローラーがなく、表示されていた場合、表示しているビュー コントローラーが返されていました。iOS 5 では、この動作は発生しなくなりました。代わりに、presentingViewController プロパティを使用して、表示側のビュー コントローラーにアクセスします。