web-dev-qa-db-fra.com

Ajouter une sous-vue à partir d'une xib ou d'une autre scène avec storyboard

Je ne connais pas encore iOS et Xcode. Je ne vois pas comment concevoir une vue séparée et la faire ajouter dans le scénario principal UIViewController.

J'ai fait différentes approches ..

  1. Il suffit de saisir un objet d'interface utilisateur dans la fenêtre d'angle inférieur droit dans le xcode, puis de le placer dans n'importe quelle zone d'espace du storyboard. Mais je ne peux pas abandonner l'objet d'interface utilisateur comme avec xib.
  2. Ajoutez un nouveau UIViewController. Ajouter une vue dans la UIViewController. Dans ViewController.m, j'obtiens la nouvelle instance UIViewController dans viewDidLoad, puis [self.view addSubview:newUIViewController.view]. Mais je ne peux pas voir la vue ajoutée.
  3. J'ai créé un nouveau fichier xib. Et ajoutez une vue dedans. J'essaie également d'obtenir l'instance dans la variable principale ViewController. Et addSubview avec la vue de xib. Mais cela a aussi échoué.

Y a-t-il une manière correcte ou une solution de travail de le faire?

20
shiami

J'ai trouvé un moyen de le faire. Décrit comme suit:

  1. Créez un fichier .xib. Par exemple: MyView.xib
  2. Créez une classe objective-c. Par exemple: MyViewClass.h et MyViewClass.m
  3. Définissez le propriétaire du fichier .xib sur la classe.
  4. Ajoutez un élément UIView sur le storyboard et définissez la classe personnalisée sur le nom de la classe objective-c (MyViewClass).
  5. Le point clé est de remplacer la méthode initWithCoder dans la classe object-c.

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self addSubview:[[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0]];
        }
        return self;
    }
    

L'idée est que la classe personnalisée est chargée par le storyboard et que initWithCode sera appelé. L'index 0 est la vue racine du générateur d'interface .xib.

C'est un peu délicat mais ça marche.

36
shiami

Dans le storyboard, faites glisser un contrôleur de vue. Le contrôleur de vue est livré avec une vue principale. Sélectionnez cette vue principale en cliquant en dehors du contrôleur de vue ajouté, puis en cliquant au centre de celui-ci. Maintenant, faites glisser un uiview ou quoi que ce soit dans cette vue principale, comme vous l'avez fait avec IB.

0
T.J.