[IPHONE] Problème entre tabBar et Interface Buillder

SuperCed

Membre expert
Club iGen
20 Juin 2001
1 329
70
45
superced.rb38.eu
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
 
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.
 
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
 
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