3

子ビュー コントローラーが複数のビュー コントローラーを表示しようとしている状況があり、その間、子ビュー コントローラーは親ビュー コントローラーから再生一時停止アクション メソッドにアクセスする必要があります。オーディオ プレーヤーを一時停止し、タイマーを一時停止し、layer:self.view.layer を一時停止し、親ビュー コントローラーで定義されている一時停止アクション メソッドを子ビュー コントローラーで使用することで、これを実現する方法を説明します。

これを解決するためのあらゆる種類の助けに感謝します。

ありがとう

4

4 に答える 4

9

プロパティを使用して、View Controller の親にアクセスできますparentViewController

if([self.parentViewController isKindOfClass:[SomeViewController class]]) {
    SomeViewController* viewController = (SomeViewController*)self.parentViewController;

    [viewController foo];
}

ただし、これはビュー コントローラー間の関係によって異なります。あなたの質問から、あなたは複数の子供と親子関係を持っていると推測しましたが、間違っていたら訂正してください! これは、View Controller が 1 つしか表示されず、ユーザーがすぐに注意を払う必要があるモーダル View Controller 表示とは大きく異なります。

説明:

UIViewControllerのparentViewControllerとプロパティの違いについて混乱しているようです。presentingViewController2 つの異なるビュー コントローラーの関係があり、それぞれがこれらのプロパティのいずれかに適用されます。

複数のビュー コントローラーのビューを親ビュー コントローラーのサブビューとして追加する場合は、ビュー コントローラー コンテインメントを使用します。この状況では、親ビュー コントローラーのサブビュー (子) として追加されたビューはいずれも、プロパティにアクセスすると、親ビュー コントローラー (子のスーパービュー、親ビューを制御する) を返し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 プロパティを使用して、表示側のビュー コントローラーにアクセスします。

于 2013-01-12T21:50:47.813 に答える
1

各ビュー コントローラには、というプロパティがありますpresentingViewController(ViewController1 がモーダルに ViewController2 を提示する場合、ViewController1 は ViewController2 のpresentingViewControllerです)。

ViewController *viewController = (ViewController *)self.presentingViewController;
[viewController function];

別のオプションは、を使用することNSNotificationCenterです。その後、アプリのどこからでも親ビュー コントローラーのメソッドを簡単に呼び出すことができます。

ParentViewController.m

-(void)viewDidLoad {

    ...

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method) name:@"Toggle Play" object:nil];

}

ChildViewController.m

[[NSNotificationCenter defaultCenter] postNotificationName:@"Toggle Play" object:nil];
于 2013-01-13T00:48:31.343 に答える
0

以下を使用して、親がUINavigationControllerORであった場合でも、子から親にアクセスできます。UIViewController

self.parentViewController

そして、あなたはこのように上に行くことができます

self.parentViewController!.parentViewController as! PARENT_VIEW_CONTROLLER
于 2016-09-10T20:19:28.290 に答える