2009-05-25 9 views
3

En tant que débutant, IB et toutes les connexions possibles me déroutent. La plupart des tutoriels que j'ai trouvés sont ce que j'appellerais la réincarnation du code spaghetti, dans lequel l'intrication est l'ensemble des connexions créées par le glisser. Bien sûr, je veux utiliser IB pour la mise en page des vues (dimensionnement & en plaçant des éléments visuels), c'est ce que IB est idéal pour. Mais un contrôleur n'est pas une vue, donc c'est moins déroutant si tous mes contrôleurs sont uniquement du code et n'apparaissent nulle part dans IB. Je soupçonne que cela minimisera les spaghettis. Il encourage également l'admonestation one-xib-per-view. À cette fin, et voici la question, où puis-je trouver des exemples de projets qui adhèrent à cette stratégie?Comment garder les contrôleurs hors de xib

Répondre

1

Bonne question. Le modèle que j'essaye de coller est de faire le contrôleur dans le code, en ajoutant IBOutlets et IBActions pour les choses dans le XIB/NIB qui interagissent avec ce code, et une chose dans le constructeur du contrôleur qui charge le XIB/NIB avec "self" comme le propriétaire, et dans IB je connecte des choses à l'espace réservé "File's Owner", dont j'aurai spécifié l'identité comme étant la classe de mon contrôleur.

4

Je n'ai pas un ensemble de projets exemples, mais je vais vous donner quelques informations sur la façon dont les choses fonctionnent et quand vous devriez créer des contrôleurs dans un fichier XIB ou dans le code.

Si vos contrôleurs sont créés dynamiquement à l'aide de l'action d'un utilisateur, vous ne les instanciez généralement pas dans un fichier XIB. Au lieu de cela, vous allez les instancier dans le code comme les mentions ci-dessus. Une fois cela fait, vous aurez toujours besoin d'un mécanisme pour connecter ce contrôleur qui a été créé en code, aux éléments de l'interface utilisateur que vous avez créés dans IB.

Le mécanisme fourni par IB pour résoudre ce problème est le propriétaire du fichier. La maîtrise du propriétaire du fichier est essentielle pour «obtenir» Interface Builder.

Le propriétaire du fichier n'est pas un objet "dans" le fichier XIB, c'est un objet représenté dans le fichier XIB. C'est un espace réservé pour un objet qui existera déjà lorsque le fichier XIB est chargé. Lorsque les fichiers NIB sont chargés au moment de l'exécution, ils sont chargés avec la méthode NSBundle - [NSBundle loadNibNamed: ownwer: options:]. Le paramètre owner est utilisé pour résoudre l'objet espace réservé propriétaire du fichier dans le fichier XIB/NIB. Lorsque le fichier est chargé au moment de l'exécution, toutes les connexions effectuées avec le propriétaire du fichier seront résolues par rapport à l'objet que vous avez transmis en tant que paramètre owner à la méthode NSBundle. Sur l'iPhone, vous ne chargez généralement pas le fichier NIB vous-même. Au lieu de cela, UIViewController le fait pour vous. L'implémentation par défaut de la méthode de loadview de UIViewController pourrait ressembler à ceci:

- (void)loadView { 
    [[self nibBundle] loadNibNamed:[self nibName] owner:self options:nil]; 
} 

Ainsi, en reliant les éléments dans votre fichier XIB au propriétaire du fichier, vous serez les connecter à votre contrôleur de vue.

Vous aurez des contrôleurs qui sont statiquement dans votre application - ils seront vivants pour toujours. Un contrôleur de navigation ou de tabulation avec ses éléments racine sont généralement actifs pendant toute la durée de vie de leur application. Lorsque c'est le cas, je définirais ces contrôleurs de vue dans le fichier MainWindow.xib. La plupart des autres contrôleurs seraient créés dynamiquement, et programmés en réponse à l'utilisateur de faire les choses.

+0

Merci, Jon, c'est une information utile. Je veux toujours essayer la stratégie consistant à ne jamais avoir de contrôleurs du côté IB. Seriez-vous d'accord que c'est faisable? Je suis toujours à la recherche d'exemples de code ... – bedouger

+0

Tout est faisable. Mais je recommanderais l'approche que j'ai énumérée ci-dessus. Créez des contrôleurs statiques dans le fichier MainWindow.xib et créez la plupart (généralement tous) de l'autre contrôleur dans le code en réponse aux actions de l'utilisateur. –

Questions connexes