Comment ajouter un Conteneur Affichage par programmation
Un Conteneur Affichage peut être facilement ajouté à un storyboard par le biais de l'Interface de l'Éditeur. Lorsqu'il est ajouté, un Conteneur de Vue, il est un espace réservé à l'affichage, un embed segue, et un (enfant) - vue-contrôleur.
Cependant, je ne suis pas en mesure de trouver un moyen d'ajouter un Conteneur en Vue de la programmation. En fait, je ne suis même pas capable de trouver une classe nommée UIContainerView
ou donc.
Un nom pour la classe de Conteneur de Vue est certainement un bon début. Un guide complet, y compris la séquence sera apprécié.
je suis conscient de Vue de la Programmation du Contrôleur de Guide, mais je n'ai pas la considérer comme la même que la façon d'Interface Builder pour le Spectateur. Par exemple, lorsque les contraintes sont correctement configurés, l' (enfant) vue s'adapte aux changements dans la taille des Conteneurs de Vue.
- Que voulez-vous dire quand vous dites que "lorsque les contraintes sont correctement configurés, l' (enfant) vue s'adapte aux changements dans la taille du Conteneur View" (ce qui implique que ce n'est pas vrai lorsque vous n'-vue-contrôleur de confinement)? Les contraintes de travail même si vous l'avez fait par conteneur de vue de l'IB ou-vue-contrôleur de confinement de la programmation.
- Le plus important, c'est de l'embarqué
ViewController
du cycle de vie. L'embeddedViewController
cycle de vie par Interface Builder est normal, mais la on a ajouté par programmation aviewDidAppear
, niviewWillAppear(_:)
niviewWillDisappear
. - Si vous ne la vue de confinement des appels correctement, le
viewWillAppear
etviewWillDisappear
sont appelés sur l'enfant-vue-contrôleur, l'amende juste. Si vous avez un exemple où ils ne sont pas, vous devez préciser, ou de poster votre propre question en leur demandant pourquoi ils ne sont pas.
Vous devez vous connecter pour publier un commentaire.
Un storyboard "conteneur view" est juste une norme
UIView
objet. Il n'y a pas de "spécial conteneur affichage de type". En fait, si vous regardez le point de vue de la hiérarchie, vous pouvez voir que le "conteneur view" est un standardUIView
:Pour réaliser cette programmation, vous employez "- vue-contrôleur de confinement":
instantiateViewController(withIdentifier:)
sur le storyboard de l'objet.addChild
dans votre parent-vue-contrôleur.view
à votre point de vue de la hiérarchie avecaddSubview
(et aussi de définir leframe
ou des contraintes selon le cas).didMove(toParent:)
méthode sur l'enfant-vue-contrôleur, en passant de la référence à la mère-vue-contrôleur.Voir Mise en œuvre d'un Conteneur de-Vue-Contrôleur dans le - Vue-Contrôleur Guide de Programmation et la "mise en Œuvre d'un Conteneur View Controller" de la UIViewController De Référence De Classe.
Par exemple, dans Swift 4.2 il pourrait ressembler à:
Note, le ci-dessus ne fait pas ajouter un "conteneur affichage" à la hiérarchie. Si vous voulez le faire, vous feriez quelque chose comme:
Ce dernier modèle est très utile si jamais la transition entre les différentes vue enfant contrôleurs et vous voulez juste pour s'assurer un point de vue d'enfant est dans le même emplacement et le précédent point de vue d'enfant (c'est à dire toutes les contraintes pour le placement sont dictées par le conteneur de vue, plutôt que de devoir reconstruire ces contraintes à chaque fois). Mais si seulement l'exécution d'un simple vue de confinement, la nécessité de ce récipient séparé point de vue est moins convaincante.
Dans les exemples ci-dessus, je suis
translatesAutosizingMaskIntoConstraints
àfalse
définir les contraintes de moi-même. Manifestement, vous pouvez laissertranslatesAutosizingMaskIntoConstraints
commetrue
et de définir à la fois laframe
et laautosizingMask
pour les vues que vous ajoutez, si vous préférez.Voir les révisions précédentes de cette réponse pour Swift 3 et Swift 2 des "restitutions".
ViewController
du cycle de vie. L'embeddedViewController
cycle de vie par Interface Builder est normal, mais la on a ajouté par programmation aviewDidAppear
, niviewWillAppear(_:)
niviewWillDisappear
.ViewController
'sviewDidAppear
est appelé dans l'un de ses parentsviewDidLoad
, au lieu de cours de l'un de ses parentsviewDidAppear
viewDidAppear
, [mais] niviewWillAppear(_:)
niviewWillDisappear
". Lewill
apparaissent méthodes sont appelées correctement dans les deux scénarios. On doit l'appelerdidMove(toParentViewController:_)
quand le faire par programmation, tho, sinon ils ne seront pas. Concernant le moment de l'apparition. méthodes, ils sont appelés dans le même ordre dans les deux sens. Ce qui diffère, tho, est le moment deviewDidLoad
, parce qu'avec le code "embed", il est chargé avantparent.viewDidLoad
, mais avec programmatique, comme on pouvait s'y attendre, il se passe pendantparent.viewLoadLoad
.translatesAutoresizingMaskIntoConstraints = false
. Je ne sais pas pourquoi il est nécessaire, ou pourquoi il fait fonctionner les choses, mais je vous remercie pour l'inclure dans votre réponse.frame
”. Bas de ligne, de définir le cadre ou les contraintes cependant appropriés pour votre application.translatesAutoresizingMaskIntoConstraints
ici pourNSView
et ici pourUIView
. Mon résumé est que mettre ce paramètre à true sur une vue rend le contenant vue d'agir comme si l'image de la taille initiale de la position (dans le superview) sont définies par l'intermédiaire de contraintes, de sorte que la sous-vue devient une "île" dont la taille et la position sont à l'abri de l'auto-mise en page qui se passe autour d'elle.translatesAutoresizingMaskIntoContraints
est la clé de cette différence. Pour ceux dont l'expérience antérieure est juste avec Storyboard enchaîne, il pourrait être utile si vous avez parlé de manière explicite dans votre réponse.frame
etautoresizingMask
tout en laissanttranslatesAutoresizingMaskIntoContraints
commetrue
, ou la mise aufalse
et en définissant les contraintes. (En aparté, cette décision n'a rien à voir avec storyboard enchaîne. Chaque fois que vous créez par programmation une vue, à vous de décider si vous souhaitez définir les contraintes, ou un ensembleframe
/autoresizingMask
et laissez le système d'exploitation traduire ceux-ci en contraintes pour vous.) Franchement, il semble un peu au-delà de la portée de la question, mais j'ai ajouté une précision à la réponse,@Rob réponse rapide 3:
Détails
Solution
Utilisation
Totalité de l'échantillon
Résultats
tableViewController
dans unviewController
, mais ne peut pas définir le titre de l'ancien. Je ne sais pas si c'est possible de le faire. J'ai posté cette question. C'est gentil de votre part si vous avez un coup d'oeil.Voici mon code swift 3, travaillent également dans les swift 4.
Utilisation
Utiliser les autres incorporer la fonction avec les non-storyboard-vue-contrôleur.
removeFromParent
appel empêche, comment voulez-vous modifier votre classe pour permettre cela?