Xcode storyboard Container View-comment accéder au viewcontroller
J'essaie d'utiliser le storyboard et de faire fonctionner les choses correctement. J'ai ajouté une vue conteneur à l'une de mes vues existantes. Lorsque j'essaie d'ajouter une référence à cela dans mon fichier de contrôleur de vue .h
(Ctrl-drag), j'obtiens un IBOutlet UIView *containerView
. Comment puis-je obtenir une référence au contrôleur de vue de la vue du conteneur à la place? J'ai besoin du contrôleur de vue du conteneur afin que je puisse définir son délégué au contrôleur de ma vue afin qu'ils puissent "parler" les uns aux autres.
J'ai ma configuration de story board comme:
Et son référencé dans mon .h fichier comme:
Avis dans le .h c'est un UIView, pas mon InstallViewController pour la vue. Comment ajouter une référence au contrôleur de vue? Je dois être capable de définir son délégué.
5 réponses
Il existe une autre solution en spécifiant un identifiant pour les segues d'intégration et en récupérant les contrôleurs de vue correspondants dans la méthode prepareForSegue:
L'avantage de cette méthode est que vous n'avez pas besoin de compter sur un ordre spécifique dans lequel vos contrôleurs de vue enfant sont ajoutés en raison du fait que chaque contrôleur de vue enfant est intégré via un identifiant de segue unique.
Mise À Jour 2013-01-17-Exemple
- (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
sont des constantes avec l'ID correspondant de la séquence Id défini dans la table de montage séquentiel.
Lorsque vous ajoutez une vue conteneur, xcode appelle la méthode UIViewController addChildViewController:
Dans votre cas, vous pouvez obtenir le conteneur ViewController à la recherche sur la liste de childViewControllers
de SplashViewController, quelque chose comme ceci:
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;
}
}
J'ai eu le même doute hier :)
La réponse de Vitor Franchi est correcte mais pourrait être plus performante et pratique. Surtout lors de l'accès au contrôleur de vue enfant plusieurs fois.
Créer une propriété readonly
@interface MyViewController ()
@property (nonatomic, weak, readonly) InstallViewController *cachedInstallViewController;
@end
Ensuite, créez une méthode getter pratique
- (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;
}
Accédez désormais au contrôleur de vue enfant de cette façon
[self.installViewController doSomething];
UIView* viewInsideOfContainer = installerView.subviews[0];
Vous donnera L'UIView à l'intérieur du UIViewController que votre contrôleur UIView référence. Vous pouvez convertir la sous-vue en n'importe quel type héritant de UIView.
Si la plume est chargée, elle appellera addChildViewController dans le cadre du processus d'initialisation
Donc une solution performante pourrait également être d'écraser
- (void)addChildViewController:(UIViewController *)childController
Là, vous pouvez attraper votre childController par exemple en comparant sa classe et l'affecter à une propriété / ivar
-(void)addChildViewController:(UIViewController *)childController
{
[super addChildViewController:childController];
if([childController isKindOfClass:[InstallViewController class]])
{
self.installViewController = (InstallViewController *)childController;
}
}
Cela vous évitera d'itérer à travers les childViewControllers.