dans iOS6, j'ai remarqué la nouvelle vue conteneur, mais je ne sais pas trop comment accéder à son contrôleur à partir de la vue conteneur.
Scénario:
Je souhaite accéder aux étiquettes du contrôleur de vue Alert depuis le contrôleur de vue qui héberge la vue conteneur.
Il y a une transition entre eux, puis-je l'utiliser?
ios
objective-c
swift
uiviewcontroller
uicontainerview
Adam Waite
la source
la source
Réponses:
Oui, vous pouvez utiliser la séquence pour accéder au contrôleur de vue enfant (et à sa vue et ses sous-vues). Donnez à la séquence un identifiant (tel que
alertview_embed
), à l'aide de l'inspecteur Attributs dans Storyboard. Demandez ensuite au contrôleur de vue parent (celui qui héberge la vue conteneur) d'implémenter une méthode comme celle-ci:la source
Vous pouvez le faire simplement avec
self.childViewControllers.lastObject
(en supposant que vous n'avez qu'un seul enfant, sinon utilisezobjectAtIndex:
).la source
childViewControllers
pour la programmation rapide
tu peux écrire comme ça
la source
L'
prepareForSegue
approche fonctionne, mais elle repose sur la chaîne magique de l'identificateur de séquence. Il y a peut-être une meilleure façon.Si vous connaissez la classe du VC que vous recherchez, vous pouvez le faire très soigneusement avec une propriété calculée:
Cela dépend
childViewControllers
. Bien que je convienne qu'il pourrait être fragile de s'appuyer sur le premier, nommer la classe que vous recherchez rend cela assez solide.la source
return childViewControllers.filter { $0 is CamperVanViewController }.first
dans une seule lignechildViewControllers.flatMap({ $0 as? CamperVanViewController }).first
ce que je pense être un peu mieux, car il jette et élimine tous les nils.first(where:)
.childViewControllers.first(where: { $0 is CamperVanViewController })
Une réponse mise à jour pour Swift 3, en utilisant une propriété calculée:
Cela ne fait qu'itérer la liste des enfants jusqu'à ce qu'elle atteigne la première correspondance.
la source
self.childViewControllers
est plus pertinent lorsque vous avez besoin du contrôle du parent. Par exemple, si le contrôleur enfant est une vue de table et que vous souhaitez le recharger de force ou modifier une propriété via un appui sur un bouton ou tout autre événement sur le contrôleur de vue parent, vous pouvez le faire en accédant à l'instance de ChildViewController et non via prepareForSegue. Les deux ont leurs applications de différentes manières.la source
Il existe une autre façon d'utiliser l'instruction switch de Swift sur le type du contrôleur de vue:
la source
J'utilise du code comme:
la source
Si quelqu'un cherche Swift 3.0 ,
viewController1 , viewController2 et ainsi de suite seront alors accessibles.
la source
Avec générique, vous pouvez faire des choses douces. Voici une extension d'Array:
Vous pouvez ensuite le faire dans votre viewController:
la source
tu peux écrire comme ça
la source