2009-09-19 10 views
11

J'ai une application avec 2 écrans (MainViewController et AboutViewController). Lorsque l'utilisateur clique sur un bouton, je voudrais charger l'écran AboutViewController, qui est défini dans un autre XIB.Comment charger un XIB?

Cela semble simple, mais je n'arrive pas à trouver mon google-fu aujourd'hui. Comment puis-je retirer ceci?

Répondre

30

Lorsque vous appelez [AboutViewController init], il est prévu d'appeler une certaine forme de [super init], qui est synonyme de [UIViewController init]. Lorsque cela se produit, votre contrôleur de vue recherchera automatiquement un fichier nib appelé (dans votre cas) AboutViewController.xib. S'il trouve ce fichier, il charge son contenu dans votre contrôleur de vue pour vous. Donc, fondamentalement, tout ce que vous devez faire est d'initialiser votre contrôleur de vue, et assurez-vous qu'il a le même nom que le fichier nib associé.

Si vous vouliez charger un fichier nib avec un nom différent dans votre contrôleur de vue, vous pouvez appeler explicitement initWithNibName:bundle: avec le nom de n'importe quel fichier nib que vous aimez.

Si l'init standard (avec un fichier nib de même nom) ne fonctionne pas pour vous, vous pouvez vérifier quelques éléments.

  • l'orthographe du nom de classe est le même que l'orthographe (et cas) du fichier nib
  • le fichier nib est inclus dans le projet, et non pas seulement assis dans le même répertoire
  • votre la méthode d'initialisation de la sous-classe UIViewController n'appelle également [super init]
  • vous appelez votre méthode d'initialisation de la sous-classe UIViewController
  • vous faites bien le point de vue du contrôleur de votre vue visible
+4

Je n'avais pas XIBs idée chargée automatiquement comme ça. Merci! – DOOManiac

0

NSBundle loadNibNamed:

11

Avec un écran À propos de, vous voulez probablement juste afficher une vue, puis la fermer. Donc, plutôt que d'utiliser un nouveau contrôleur de vue, vous pouvez simplement couvrir la vue actuelle.

En supposant que vous avez un Ivar

UIView *aboutUsView; 

avec la propriété appropriée.

Dans votre contrôleur de vue faire:

[[NSBundle mainBundle] loadNibNamed:@"AboutUsView" owner:self options:nil]; // Retains top level items 
[self.view addSubview:aboutUsView]; // Retains the view 
[aboutUsView release]; 

Pour enlever la vue, par exemple dans une action reliée à un bouton sur la vue, faire:

[aboutUsView removeFromSuperview], aboutUsView = nil; // Releases the view 
+0

Il a spécifiquement dit qu'il avait deux contrôleurs de vue, "MainViewController et AboutViewController" pas un contrôleur de vue et une vue. – mahboudz

+5

Correct. Et j'ai spécifiquement dit qu'il n'a peut-être pas besoin des deux pour atteindre son objectif déclaré. –

+0

Cela semble la méthode évidente. – user1432813

Questions connexes