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:

entrez la description de l'image ici

Et son référencé dans mon .h fichier comme:

entrez la description de l'image ici

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é.

46
demandé sur DAXaholic 2012-11-07 21:38:04

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.

69
répondu DAXaholic 2013-01-18 05:26:27

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 :)

14
répondu Vitor Franchi 2013-03-29 22:51:38

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];
2
répondu Martin Stolz 2014-03-31 10:53:27
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.

0
répondu John Verco 2013-05-17 17:37:43

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.

0
répondu Alexander Ney 2014-03-31 11:35:08