# [IPHONE] Problème entre tabBar et Interface Buillder



## SuperCed (21 Octobre 2010)

Bonjour,

j'essaye de faire un petit projet iPhone.
Pour le moment, j'essaye de faire quelque chose de très simple.
J'essaye d'avoir une tabBar, et des boutons et champs (textFieldField) sur la première vue de la tabBar.

Pour cela, j'ai utilisé le template fournit par Apple qui fournit une tabBar fonctionnelle directement.
Donc ça me crée 2 classes : FirstView et SecondView . Il crée aussi 3 "xib", main xib, first xib et second xib.

Tout  ça fonctionne bien, dans ma première vue, sur Interface Builder, j'ai  ajouté un champ text 'TextFieldView" et un bouton "ok".

Bref, du très très simple...
Ensuite,  j'ai essayé de créer des propriétés dans la Classe FirstView du  Template pour y mettre un Outlet qui fait référence à mon champ.
Là,  bizarre, dans Interface Builder, pas moyen de sélectionner l'outlet  depuis le FirstResponder et de le lier à mon élément champ.

J'ai  donc créé un ViewController sur mon first xib, je lui ai donné une  nouvelle classe qui dérive de UIViewController, j'ai créé mes outlet qui  font référence à mon champ text. Et là, j'ai réussi à le lier  normalement dans interface builder.

Alors zou, je passe au bouton  et j'essaye le lier l'action touch down inside à mon controller afin de  récupérer l'événement. La pareil, je fait bien la méthod et tout, mais  pof, ça plante dès que j'appuie sur le bouton... Pourtant, il y a rien  dans la méthode, juste un NSLog.

Alors, j'ai essayer de mettre le  même sélecteur sur la classe FirstView, et là, j'ai réussi à lier  l'action. Là, ça fonctionne, j'ai bien mon NSLog qui s'affiche.
Dans IB, j'ai donc lié mon action au "First Responder".

Maintenant,  mon problème est le suivant : comment puis-je faire dialoguer ma Classe  FirstView qui reçoit l'événement du bouton, avec le Controller que j'ai  créé et qui contient les référence aux autres éléments d'interface.

Il  me semble bien que quand on crée un ViewController sur le .xib dans IB,  celui-ci est instancié au chargement du .xib. Par contre, je ne sais  pas comment trouver son instance depuis ma classe FirstView.

Plus généralement, j'ai plein de questions :
- Pourquoi ne peut-on pas mettre les références aux objets d'interface dans la classe FirstView ?
- Pourquoi le fait de mettre les action sur un controller que j'ai ajouté fait planter le programme ?
- A quoi correspond réellement "FirstResponder" dans IB ?
- A quoi sert "File's Owner" dans IB ?
- Comment retrouver une instance de ViewController d'un .xib ?

En tous cas, c'est vraiment pas intuitif...

Merci


----------



## Céroce (21 Octobre 2010)

Non, ce n'est pas intuitif, il y a des concepts sous-jacents qu'il est *nécessaire d'apprendre*, avec un bon bouquin qui t'expliquerait:


qu'une outlet est une variable d'instance
qu'IB a besoin de savoir la classe d'un objet pour connaître ses outlets
qu'il existe un "chaîne de répondeurs" sous Cocoa et que si le firstResponder ne peut pas répondre à l'action (action avec "nil" pour cible), la chaîne est traversée pour trouver un objet qui y répond.
que file's owner est le propriétaire du fichier NIB, c'est à dire celui qui l'a instancié, dans ce cas un UIViewController.

Le problème n'est pas que c'est mal fichu, c'est que tu veux mettre la charrue avant les bufs.


----------



## SuperCed (21 Octobre 2010)

Merci pour ta réponse.

J'ai bien compris tout ce que tu dis.
Comment connaître la "chaine de répondeurs" ?
Comment puis-je savoir à quelle instance correspond le first responder ?

En fait, j'ai l'impression qu'il s'agit du premier item de la toolbar dans mon cas.
Cependant, cet objet est définit dans le premier xib, donc je ne peux pas faire de connexion en direct d'un xib à l'autre.

Sinon, comment changer le first responder pour que ce soit mon controller et pas l'objet dans l'autre xib ?

Merci


----------



## SuperCed (21 Octobre 2010)

Ok, finalement j'ai réussi.

J'ai utilisé le File's Owner en tant que controller. Je lui ai mis une classe que j'ai définie. Du coup, j'avais les outlet et les cations que je voulais et ça fonctionne.

Après, il va me rester un autre défit, celui de passer des messages d'un nib à l'autre, par l'intermédiaire du Bundle ou du délégué d'application.

Bref, pour ça, on verra après.

Merci


----------

