1

2 つのビューがあり、それぞれに独自のビュー コントローラーがあります。最初のビューには 2 つのボタン ("Button" と "Button2") があります。「ボタン」をクリックすると、下の画像に示すように、UIPickerView最初のビューの上に ( を実行して) ホバリングするを含む 2 番目のビュー コントローラーが読み込まれます)。addSubviewこの 2 番目のビューの [アイテム] ボタンをクリックすると、UIPickerView. 「アイテム」ボタンをクリックすると、 でビューを非表示にするだけでなく、UIPickerViewからアイテムを選択してボタンの名前を設定したいUIPickerView

(これら 2 つのビューには、それぞれ独自のビュー コントローラーがあります。)

画面のスナップショット

4

2 に答える 2

2

プロセスは次のとおりです。

  1. 子View Controllerが親View Controllerに通知するためのプロトコルを定義します。

    //
    //  ChildViewDelegate.h
    //
    
    #import <Foundation/Foundation.h>
    
    @protocol ChildViewDelegate <NSObject>
    
    - (void)didUpdateValueX:(NSString *)string;
    
    @end
    

    明らかにdidUpdateValueX、より意味のある名前に置き換えてください。

  2. そのプロトコルに準拠するように親View Controllerを定義します。

    //
    //  ViewController.h
    //
    
    #import <UIKit/UIKit.h>
    #import "ChildViewDelegate.h"
    
    @interface ViewController : UIViewController <ChildViewDelegate>
    
    // the rest of your interface here
    
    @end
    
  3. 親コントローラーがそのプロトコルのメソッドを実装していることを確認してください。

    - (void)didUpdateValueX:(NSString *)string
    {
        // do whatever you want with it
    }
    
  4. 親が子を追加するときは、必要なカスタム コンテナー呼び出し、特にaddChildViewControllerandを必ず呼び出してdidMoveToParentViewControllerください。

    UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"child"];
    [self addChildViewController:controller];
    controller.view.frame = ...;
    [self.view addSubview:controller.view];
    [controller didMoveToParentViewController:self];
    
  5. 子が親に通知して自分自身を却下する準備ができると、次のようなことを行います。

    if ([self.parentViewController conformsToProtocol:@protocol(ChildViewDelegate)])
    {
        [(id<ChildViewDelegate>)self.parentViewController didUpdateValueX:someStringValue];
    
        [self willMoveToParentViewController:nil];
        [self.view removeFromSuperview];
        [self removeFromParentViewController];
    }
    else
    {
        NSLog(@"%s: %@ does not conform to ChildViewDelegate!!!", __FUNCTION__, self.parentViewController);
    }
    

    これは、プロトコル メソッドを呼び出してから、自分自身を削除します (必要な包含メソッドを呼び出し、willMoveToParentViewController:nilおよびremoveFromParentViewController)。

理論的には、親にクラス プロパティがあり、子が理論的にはそれを直接参照できる場合、これを単純化できます (すべての封じ込め要素を保持しますが、プロトコルは破棄します)。ただし、ベスト プラクティスはプロトコルを使用することです。親コントローラーにとらわれない。

ビュー コントローラー プログラミング ガイドの「カスタム コンテナー ビュー コントローラーの作成」を参照してください。そもそもこれらのコンテナー呼び出しを使用することが重要な理由については、WWDC 2011 のビデオUIViewController Containment の実装を参照してください。

于 2013-06-28T15:23:26.963 に答える