ストーリーボードを使用して、物事を適切に機能させようとしています。既存のビューの1つにコンテナビューを追加しました。 View Controllerでこれへの参照を追加しようとすると.h
ファイル(Ctrlキーを押しながらドラッグ)、IBOutlet UIView *containerView
。代わりにコンテナビューのView Controllerへの参照を取得するにはどうすればよいですか?コンテナーView Controllerが必要なので、ビューのコントローラーにデリゲートを設定して、お互いに「通信」できるようにします。
ストーリーボードのセットアップは次のとおりです。
そして、それは私の.hファイルで次のように参照されています:
ビューのInstallViewControllerではなく、UIViewである.hに注目してください。 View Controllerに参照を追加するにはどうすればよいですか?デリゲートを設定できる必要があります。
埋め込みセグエの識別子を指定し、メソッド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_SegueIdEmbedMasterVC
&c_SegueIdEmbedDetailVC
は、ストーリーボードで定義されたセグエIDの対応するIDを持つ定数です。
コンテナビューを追加すると、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;
}
}
昨日も同じ疑いがありました:)
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];
UIView* viewInsideOfContainer = installerView.subviews[0];
コントローラーUIViewが参照するUIViewController内のUIViewを提供します。サブビューは、UIViewを継承する任意のタイプにキャストできます。
ペン先がロードされると、初期化プロセスの一部としてaddChildViewControllerを呼び出します
そのため、パフォーマンスを向上させるには、上書きすることもできます
- (void)addChildViewController:(UIViewController *)childController
そこで、childControllerをキャッチできます。クラスを比較し、プロパティ/ ivarに割り当てることにより
-(void)addChildViewController:(UIViewController *)childController
{
[super addChildViewController:childController];
if([childController isKindOfClass:[InstallViewController class]])
{
self.installViewController = (InstallViewController *)childController;
}
}
これにより、childViewControllersを繰り返し処理する必要がなくなります。