web-dev-qa-db-ja.com

xcode storyboard Container View-ViewControllerにアクセスする方法

ストーリーボードを使用して、物事を適切に機能させようとしています。既存のビューの1つにコンテナビューを追加しました。 View Controllerでこれへの参照を追加しようとすると.hファイル(Ctrlキーを押しながらドラッグ)、IBOutlet UIView *containerView。代わりにコンテナビューのView Controllerへの参照を取得するにはどうすればよいですか?コンテナーView Controllerが必要なので、ビューのコントローラーにデリゲートを設定して、お互いに「通信」できるようにします。

ストーリーボードのセットアップは次のとおりです。

enter image description here

そして、それは私の.hファイルで次のように参照されています:

enter image description here

ビューのInstallViewControllerではなく、UIViewである.hに注目してください。 View Controllerに参照を追加するにはどうすればよいですか?デリゲートを設定できる必要があります。

48
Justin808

埋め込みセグエの識別子を指定し、メソッドprepareForSegue:で対応するView Controllerを取得する別のソリューションがあります

この方法の利点は、各子View Controllerが一意のセグエ識別子を介して埋め込まれているため、子View Controllerが追加される特定の順序に依存する必要がないことです。

更新2013-01-17-例

- (void) prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
    // -- Master View Controller
    if ([segue.identifier isEqualToString:c_SegueIdEmbedMasterVC])
    {
        self.masterViewController = segue.destinationViewController;
        // ...
    }
    // -- Detail View Controller
    else if ([segue.identifier isEqualToString:c_SegueIdEmbedDetailVC])
    {
        self.detailViewController = segue.destinationViewController;
        // ...
    }
}

c_SegueIdEmbedMasterVCc_SegueIdEmbedDetailVCは、ストーリーボードで定義されたセグエIDの対応するIDを持つ定数です。

69
DAXaholic

コンテナビューを追加すると、xcodeはUIViewControllerメソッドaddChildViewController:

あなたのケースでは、SplashViewControllerのchildViewControllersのリストでコンテナViewControllerを探すことができます。これは次のようなものです:

for (UIViewController *childViewController in [self childViewControllers])
{
    if ([childViewController isKindOfClass:[InstallViewController class]])
    {
        //found container view controller
        InstallViewController *installViewController = (InstallViewController *)childViewController;

        //do something with your container view viewcontroller

        break;
    }
}

昨日も同じ疑いがありました:)

14
vfranchi

Vitor Franchi の答えは正しいですが、よりパフォーマンスが高く便利です。特に、子View Controllerに数回アクセスする場合。

読み取り専用プロパティを作成する

@interface MyViewController ()
@property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController;
@end

次に、便利なゲッターメソッドを作成します

- (InstallViewController *)installViewController
{
    if (_cachedInstallViewController) return _cachedInstallViewController;

    __block InstallViewController *blockInstallViewController = nil;
    NSArray *childViewControllers = self.childViewControllers;
    [childViewControllers enumerateObjectsUsingBlock:^(id childViewController, NSUInteger idx, BOOL *stop) {

        if ([childViewController isMemberOfClass:InstallViewController.class])
        {
            blockInstallViewController = childViewController;
            *stop = YES;
        }
    }];

    _cachedInstallViewController = blockInstallViewController;

    return _cachedInstallViewController;
}

これから子View Controllerにそのようにアクセスします

[self.installViewController doSomething];
2
Martin Stolz
UIView* viewInsideOfContainer = installerView.subviews[0];

コントローラーUIViewが参照するUIViewController内のUIViewを提供します。サブビューは、UIViewを継承する任意のタイプにキャストできます。

0
John Verco

ペン先がロードされると、初期化プロセスの一部としてaddChildViewControllerを呼び出します

そのため、パフォーマンスを向上させるには、上書きすることもできます

- (void)addChildViewController:(UIViewController *)childController

そこで、childControllerをキャッチできます。クラスを比較し、プロパティ/ ivarに割り当てることにより

-(void)addChildViewController:(UIViewController *)childController
{
    [super addChildViewController:childController];

    if([childController isKindOfClass:[InstallViewController class]])
    {
        self.installViewController = (InstallViewController *)childController;
    }

}

これにより、childViewControllersを繰り返し処理する必要がなくなります。

0
Alexander Ney