Comment ajouter un sous-vue qui a son propre UIViewController en Objective-C?
J'ai du mal avec les sous-vues qui ont leur propre UIViewControllers
. J'ai un UIViewController
avec une vue (rose clair) et deux boutons sur un toolbar
. Je veux le bleu de l'affichage lorsque le premier bouton est pressé et le jaune d'affichage avec le deuxième bouton est pressé. Devrait être facile si je voulais juste pour l'afficher. Mais le bleu de la vue contient un tableau, donc il a besoin de son propre contrôleur. C'était ma première leçon. J'ai commencé avec cette SORTE de question où j'ai appris j'ai besoin d'un contrôleur de la table.
Donc, je vais sauvegarder et de prendre des mesures pour bébés ici. Ci-dessous est une photo d'un simple point de départ avec mon Utilitaire ViewController
(la principale-vue-contrôleur) et les deux autres contrôleurs (bleu et jaune). Imaginez que lorsque l'Utilitaire ViewController
(l'écran principal) s'affiche d'abord le bleu (par défaut) sera affiché à l'endroit où le rose de la vue. Les utilisateurs seront en mesure de cliquer sur les deux boutons pour faire l'aller-retour et le rose de la vue ne sera JAMAIS affichée. Je veux juste le bleu de la vue à aller là où le rose vue est et le jaune d'affichage pour aller là où la rose de point de vue est. J'espère que cela a du sens.
Je suis en train d'utiliser addChildViewController
. De ce que j'ai vu, il y a deux façons de le faire: Le Conteneur de Vue dans le storyboard
ou addChildViewController
par programmation. Je veux le faire par programmation. Je ne veux pas utiliser un NavigationController
ou une barre d'Onglet. Je veux juste ajouter que les contrôleurs et les pousser à la vue correcte dans le rose de la vue lorsque la touche est pressée.
Ci-dessous le code que j'ai jusqu'ici. Tout ce que je veux faire, c'est afficher le bleu de la vue où le rose point de vue est. De ce que j'ai vu, je devrais être en mesure de simplement addChildViewController
et addSubView. Ce code n'est pas fait pour moi. Ma confusion est de mettre le meilleur de moi. Quelqu'un peut-il m'aider à obtenir le bleu de l'affichage de la vue où le rose vue est?
Ce code n'est pas destiné à faire autre chose que d'afficher le bleu de l'afficher dans le viewDidLoad.
IDUtilityViewController.h
#import <UIKit/UIKit.h>
@interface IDUtilityViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIView *utilityView;
@end
IDUtilityViewController.m
#import "IDUtilityViewController.h"
#import "IDAboutViewController.h"
@interface IDUtilityViewController ()
@property (nonatomic, strong) IDAboutViewController *aboutVC;
@end
@implementation IDUtilityViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.aboutVC = [[IDAboutViewController alloc]initWithNibName:@"AboutVC" bundle:nil];
[self addChildViewController:self.aboutVC];
[self.aboutVC didMoveToParentViewController:self];
[self.utilityView addSubview:self.aboutVC.aboutView];
}
@end
--------------------------MODIFIER------------------------------
L'auto.aboutVC.aboutView est nul. Mais j'ai câblé dans le storyboard
. Dois-je encore besoin d'instancier?
- Quel est le réel problème que vous rencontrez?
- Lorsque le point de vue des charges, je vois la rose vue. Je suppose que je ne dois pas être le codage correctement.
- À droite, OK. Tout d'abord, l'étape à travers le code d'une ligne à la fois et assurez-vous qu'aucun des objets sont
nil
. Specificalyl auto.aboutVC, de soi.utilityView et l'auto.aboutVC.aboutView. - Vous êtes correct. Le soi.aboutVC.aboutView est nul. Mais j'ai câblé le tout dans le storyboard. Je vais mettre à jour ma question avec l'image.
- Ce qui est ur premier bouton et quel est votre deuxième bouton? Et quand u dire la blueview où la rose est...ne u veux dire une fois que le blueview est sur l'écran—encore le 'X' et '?' Sont accrochés là dans le haut de la vue?
Vous devez vous connecter pour publier un commentaire.
Ce post qui date des premiers jours de moderne iOS, a généralement la dernière syntaxe, comme Swift 4 actuellement. Si vous êtes à partir de l'iOS, mise en page automatique, etc il vous va.
Dans iOS aujourd'hui "tout est un conteneur view". C'est la façon la plus simple de vous faire des applications d'aujourd'hui.
Une application peut être si simple que ça vient de la une vue. Mais même dans ce cas, chaque "chose" sur l'écran est un conteneur de vue.
C'est facile...
(A) faites Glisser un conteneur en vue de votre scène...
Glisser un conteneur en vue dans votre scène vue. (Comme vous le feriez glisser dans, disons, un UIButton.)
Le conteneur de vue est le marron chose dans cette image. Il est en fait à l'intérieur de votre scène vue.
Lorsque vous faites glisser un conteneur en vue dans votre scène, vue, Xcode, vous donne automatiquement deux choses:
Vous obtenez le conteneur vue à l'intérieur de votre scène vue, et,
vous obtenez un tout nouveau
UIViewController
qui est juste assis autour de quelque part sur le blanc de votre storyboard.Les deux sont connecté avec le "Symbole Maçonnique" chose - qu'expliqué ci-dessous!
(B) Cliquez sur cette nouvelle vue-contrôleur (la nouvelle chose Xcode fait pour vous, quelque part sur la zone blanche, pas la chose à l'intérieur de votre scène) ... et, changer la classe!
C'est vraiment aussi simple que cela.
Vous avez terminé.
Ici est la même chose, explique visuellement.
Avis de la conteneur affichage à
(A)
.Avis de la contrôleur à
(B)
.Cliquez sur B. (C'est le B - Un pas!)
Aller à l'inspecteur en haut à droite. Remarquez qu'il dit "UIViewController"
[][3]
De le modifier pour votre propre classe, qui est un UIViewController.
J'ai une Swift classe
Snap
qui est unUIViewController
.Alors, où il est dit "UIViewController" dans l'Inspecteur, j'ai tapé dans "Snap".
(Comme d'habitude, Xcode auto-complete "Snap" que vous commencez à taper "Snap...".)
Que tout y est, vous avez terminé.
Comment changer le conteneur view - dire, à la vue de la table.
Ainsi, lorsque vous cliquez sur pour ajouter un conteneur de vue, Apple vous donne automatiquement un lien view controller, assis sur la table de montage séquentiel.
Comme il arrive (2017): il fait un
UIViewController
par défaut.Qui est idiot: il doit se demander à quel type vous avez besoin. Par exemple, souvent, vous avez besoin d'une vue de la table. Voici comment le changer pour quelque chose de différent:
Version courte: supprimez les UIViewController. Mettre une nouvelle
UICollectionViewController
sur la table de montage séquentiel. Contrôle-glissez-la de: le conteneur afficher les Connexions de Déclenchement Segue - viewDidLoad, pour, votre nouveau contrôleur. Veillez à sélectionner l'option "embed" dans le popup.Entrer l'identificateur de texte...
Vous avez un de ces "carré dans un carré" symbole Maçonnique choses: c'est sur le "bandé de la ligne" connexion de votre conteneur de vue avec la vue du contrôleur.
Le "symbole maçonnique", c'est le segue.
Sélectionnez la séquence en cliquant sur sur le "symbole maçonnique" de la chose.
Regardez à votre droite.
Vous DOIT type dans un identificateur de texte pour la séquence.
De vous décider sur le nom. Il peut être n'importe quelle chaîne de texte. Un choix judicieux est souvent "segueClassName".
Si vous suivez ce modèle, tous vos enchaîne sera appelé segueClockView, seguePersonSelector, segueSnap, segueCards et ainsi de suite.
Prochaine, où utilisez-vous que l'identificateur de texte?
Comment connecter " à " l'enfant du contrôleur...
Ensuite, procédez de la manière suivante, dans le code, dans le ViewController de l'ensemble de la scène.
Disons que vous avez trois conteneurs de vue dans la scène. Chaque conteneur de vue est titulaire d'un contrôleur différent, dire "Snap", "Horloge" et "Autres".
Dernière Swift3 syntaxe (2017)
C'est aussi simple que cela. Vous vous connectez une variable pour désigner les contrôleurs, à l'aide de la
prepareForSegue
appel.Comment brancher dans l'autre sens, à la mère...
Dire que vous êtes "dans" le contrôleur qui vous ont mis dans un récipient à la vue ("Snap" dans l'exemple).
Il peut être une source de confusion pour arriver à le "patron" - vue-contrôleur au-dessus de vous ("tableau de bord" dans l'exemple). Heureusement, c'est ce simple:
Critique: ne fonctionne qu'à partir de
viewDidAppear
ou plus tard. Ne fonctionne pas dansviewDidLoad
.Vous avez terminé.
Important: que seulement fonctionne pour conteneur de vues.
Importantes avancées astuce: N'oubliez pas, qui ne fonctionne que pour les conteneurs vues.
Ces jours-ci avec storyboard identifiants, il est banal de just pop de nouveaux points de vue sur l'écran (plutôt que dans le développement Android). Donc, disons que l'utilisateur veut modifier quelque chose...
Lors de l'utilisation d'un conteneur de vue, IL EST GARANTI que Dash va être le parent-vue-contrôleur de composant logiciel Enfichable.
Cependant que est PAS NÉCESSAIREMENT LE CAS lorsque vous utilisez instantiateViewController.
Très prêter à confusion, dans iOS le parent-vue-contrôleur est pas liées à la classe qui instancié. (Il pourrait être le même, mais, habituellement, il n'est pas le même.) Le
self.parent
modèle est seulement pour conteneur de vues.(Pour un résultat similaire dans le instantiateViewController motif, vous devez utiliser un protocole et d'un délégué, se souvenant que le délégué être un maillon faible.)
prepareForSegue mal nommée...
Il est intéressant de noter que "prepareForSegue" est un vraiment mauvais nom!
"prepareForSegue" est utilisé à deux fins: le chargement d'un conteneur de points de vue, et, segueing entre les scènes.
Mais dans la pratique, vous très rarement des enchaînements entre les scènes! Alors que pratiquement toutes les applications a beaucoup, beaucoup, conteneur vues comme une question de cours.
Il serait beaucoup plus logique si "prepareForSegue" a été appelé quelque chose comme "loadingContainerView".
Plus d'un...
Une situation courante est: Vous avez une petite zone de l'écran où vous voulez afficher l'un des un certain nombre de vue différents contrôleurs. Par exemple, l'un des quatre widgets.
La façon la plus simple de le faire: avoir juste quatre des récipients différents points de vue tous assis dans le même zone. Dans votre code, il suffit de masquer tous les quatre et mettez celui que vous voulez visible.
Sur la table de montage séquentiel, ont un vide "titulaire" UIView, qui tient simplement les quatre conteneur de vues. Vous pouvez ensuite la taille ou déplacer tous les quatre à la fois par de dimensionnement ou de déplacer le "titulaire". Dans votre code, il suffit de disposer de quatre
UIView
points de vente, un pour chaque conteneur de vues. Copier et coller le code ci-dessus, "Comment se connecter au contrôleur enfant", pour relier les quatre contenues vue des contrôleurs.Note - Storyboard Références arriver!
Comme SimplGy points ci-après "iOS 9 Storyboard Références faire conteneur des vues encore plus impressionnant. Vous pouvez définir votre réutilisables vue (contrôleur) où vous le souhaitez et de référence à partir d'un conteneur de vue multiples, modulaire des story-boards."
Remarque aussi que plutôt de prêter à confusion, souvent aujourd'hui, vous ne vous embêtez pas avec des conteneurs de vues!
Il vous suffit de
instantiateViewController#withIdentifier
dans de nombreuses situations.Mais notez le "gotchya" sur
.parent
expliqué ci-dessus. Le point de l'ensemble de conteneur de vues est, vous êtes instantanément et simplement assuré de la maison mère de la chaîne.Si vous allez avec
instantiateViewController#withIdentifier
à l'aide d'un scénario de référence, vous avez à perdre avec un protocole et d'un délégué (en se souvenant que le délégué être un maillon faible). Mais ensuite, vous pouvez utiliser "à la volée" souplesse n'importe où.En contraste à l'aide d'un "fixe", pour ainsi dire, d'un conteneur de point de vue est extrêmement simple, et vous aurez instantanément crochet entre le parent et l'enfant, comme expliqué ci-dessus.
Je vois deux problèmes. Tout d'abord, puisque vous faites les contrôleurs dans le storyboard, vous devriez être à l'instanciation d'eux avec
instantiateViewControllerWithIdentifier:
, pasinitWithNibName:bundle:
. Deuxièmement, lorsque vous ajoutez de la vue comme une sous-vue, vous devriez lui donner un cadre. Donc,