50

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

ストーリーボードの設定は次のとおりです。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

4

5 に答える 5

70

埋め込みセグエの識別子を指定し、メソッドで対応するビューコントローラを取得することによる別の解決策がありますprepareForSegue:

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

更新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を持つ定数です。

于 2012-11-16T17:00:15.783 に答える
14

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

あなたの場合、次のように、SplashViewController のリストでそれを探してコンテナ ViewController を取得できますchildViewControllers

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;
    }
}

私は昨日同じ疑問を持っていました:)

于 2012-11-09T14:04:23.167 に答える
2

Vitor Franchiの答えは正しいですが、より高性能で便利な場合があります。特に子View Controllerに数回アクセスする場合。

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

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

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

- (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];
于 2014-03-31T10:53:27.453 に答える
0
UIView* viewInsideOfContainer = installerView.subviews[0];

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

于 2013-05-17T17:37:43.223 に答える
0

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

そのため、パフォーマンスの高いソリューションは上書きすることもできます

- (void)addChildViewController:(UIViewController *)childController

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

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

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

}

これにより、childViewControllers を反復処理する必要がなくなります。

于 2014-03-31T11:35:08.583 に答える