Interface Builder

PowerMike

Membre actif
26 Avril 2000
583
0
Sous OS X vous voyez tous la fenêtre du client Mail et son petit tiroir où on peut trouver les différentes adresses email.
Bon, ben comment fait-on pour créer une fenêtre similaire.
J'arrive en faisant glisser la fenêtre à la créer mais je ne sais pas comment éditer le petit tiroir.

D'ailleurs comment fait-on pour modifier nos fenêtres dynamiquement. Je m'explique je veux donc dans ce petit tiroir afficher des noms au fur et à mesure que des gens se connectent à un canal IRC, comment gérer le fait que des noms apparâitront ou disparaîtront

De même, je veux une fenètre à onglets, chaque onglet representerait une connexion à un serveur IRC, comment créer ou supprimer dynamiquement des onglets au fur et à mesure des connexions et deconnexions ?
 
Comme dirait Manu, Fastoche ;-)
Bon je répond à la première question :
>Sous OS X vous voyez tous la fenêtre du client Mail et son petit tiroir où on peut trouver les différentes adresses email.
>Bon, ben comment fait-on pour créer une fenêtre similaire.
>J'arrive en faisant glisser la fenêtre à la créer mais je ne sais pas comment éditer le petit tiroir.
Tu peux aussi prendre le NSDrawer seul, le déposer dans les instances de la ressources, tu fais un control-click vers une fenetre et tu connectes avec parent Window
Pour gerer l'interieur du Drawer, ajoute une View dans tes instances, et tu fais un control-click depuis le Drawer, vers la View, que tu connectes avec Content View...

 
J'ai oublié de préciser : tu double click sur la NSView et tu t'en sers comme une fenetre...

Pour les autres questions, il te faut du code... Tu as plusieurs solutions : tu mets tes objets ou tu veux, dans tes ressources. Tu créés ensuite un objet ( comme Manu t'avais dis, je crois) tu y ajoute autant d'outlet que d'objet que tu souhaite manipuler, et tu y ajoute une fonction, tu créé une instance de ton objet, et tu connectes un évenement clef à ta fonction (un click sur le bouton connecte)... dans celle ci tu peux manipuler tes objets d'interfaces(représentés par les differents Outlets), en t'aidant de leur documentation...
Sinon je pense que obtenir un pointeur sur les objets des ressources nib, mais je ne sais pas encore comment faire...
Manu le sait peut-etre
wink.gif
...

Je n'explique pas trop bien donc si t'as d'autres questions...
 
Ça se précise mais c'est pas encore tout à fait clair dans ma tête. J'ai fait tout ça, au début c'était pas clair, ça l'est un peu plus.
Il faut juste que je buche un peu les objets, leurs méthodes.
Merci.
En fait ce serait cool que l'un de vous puisse faire une bref tour d'horizon de Project builder et de Interface builder : possibilités, fonctions
comment on crée une interface, un projet ...
aussi un tour d'horizon des objets ...
 
Cool, cool, ça se précise de plus en plus.
J'ai réussi à faire ce que voulais .. j'ai fait apparaître mon drawer en actionnant un bouton ... cool.
Mais maintenant un peu plus compliqué ...
Mon bouton qui utilise l'action Open de la classe NSDrawer ne peut servir qu'à ouvrir le Drawer ... comment faire si je veux que ce bouton me permette de refermer le drawer (utilises l'action Close) sans déconnecter l'action Open.
Si j'ai bien compris y a pas de moyen ??
MAis alors comment faire pour remplacer le bouton par un autre bouton, lorsque l'ouverture est faite, qui lui permettrait de refermer le Drawer ?
Est-ce que cet aspect dynamique peut être traité dans IB ?
 
Dans PB
créé un nouveau projet, et ouvre la seule ressource du projet
dans IB

ajoute un objet(manu a dja expliqué, m'enfin bon'
wink.gif
): Onglet 'Classe', clique sur NSObject, et Selectionne : Menu 'Classes:Subclass' Un nouvel element apparait, renomme le comme tu veux puis tappe sur retour.
Selectionne : Menu 'Classes:Add Action'
Un nouvel element apparait, renomme le comme tu veux puis tappe(OpenClose) sur retour.(en laissant les ':'
Selectionne : Menu 'Classes:Add Outlet'
Un nouvel element apparait, renomme le comme(Drawer) tu veux puis tappe sur retour.
--(bonjour le pomme-c, pomme-v :-) )

maintenant reselectionne ton objet et Selectionne : Menu 'Classes:Instantiate'
dans l'onglet Instances Un nouvel element apparait son nom est le nom de la classe précédement créé.
(re)-fais ton interface et connecte ton bouton Open à ton nouvel obj sur la seule fonction dispo.
Connect ton objet au Drawer, et double clique sur l'outlet (nommé peut-etre Drawer)

retourne dans l'onglet Classes. select ton obj et Selectionne : Menu 'Classes:Create File' sauve les fichiers dans ton dossier de Projet PB, et veille à ce qu'il l'insere dans PB (y a une checkbox dans la fenetre de sauvegarde)
Reprend PB:
tu dois avoir 2 fichiers : coucou.h et coucou.m
le premier defini la classe (Propriétés et Methodes)
le second implemante les methodes, c'est à dire que tu donnes le code des methodes que tu as définies
donc prend coucou.m, et tape entre les 2 accolades le code suivant (sans les crochets)
[

if([[[sender attributedTitle] string] isEqualToString:@"Open"]==true)//On doit ouvrir le drawer
{
[sender setTitle:@"Close"];
[Drawer open];
}else//on doit fermer le drawer
{
[sender setTitle:@"Open"];
[Drawer close];
}

]

Donc en premier tu poses une condition (si ton bouton a comme titre Open, tu lui attribues ([sender setTitle:@"Close"]
wink.gif
, le nouveau titre 'Close', et tu ouvres le drawer( [Drawer open]
wink.gif


dans le cas contraire (si ton bouton a un titre different de Open) tu fais le contraire...

Ouf !!!

Bon si t'as des questions (ce dont je ne doute pas), ch'uis la... ;-)
 
Salut,

Un mot sur l'utilisation d'IB.

Ne pas oublier qu'une application cocoa est une instance de l'objet NSApplication.

En fait il faut voir une application cocoa come un ensemble d'objets qui s'envoient des messages les uns aux autres pour demander des services afin de fournir un service global, celui de l'application.

Dans ce contexte, les objets travaillent en étroite collaboration, c'est à dire dès qu'un objet change d'état, n'étant pas isolé, il DOIT avertir les autres objets de ce changement.

Ceci est surtout valable pour les objets de l'interface graphique.
Le runtime cocoa offre à ces objets 2 façons de le faire.

La DELEGATION et la NOTIFICATION

La délégation permet en fait à un objet de dire "lorsque mon état change, je le signale en envoyant le message yyy à l'objet qui se déclare comme étant mon délégué". C'est ainnsi que lorsque vous regardez attentivement les methodes des objets de l'Application kit, vous découvrez des methodes envoyées au délégué sous la rubrique
Methods Implemented By the Delegate.

C'est pourquoi lorsque vous définissez dans IB un controller (une interface wwww=un wwwController de cette interface), les outlets généralement envoient des messages à leur délégué.
Pour déclarer que le controller est délégué d'une outlet, il faut tirer un trait de connection de l'outlet vers l'instance du controller (generalement une brique) dans la nib, puis dans l'inspecteur selectionner delegate et cliquer sur connect.

Ou par programme en codant dans la methode awakeFromNib du controller l'instruction :
[nom-de-l'outlet setDelegate:self].

Par contre dans le source du controller il faut implémenter la ou les méthodes qui vous interessent pour agir.
En effet il y a 2 type de messages
- les messages qui ont une syntaxe du style xxxShouldyyyy (ex : textShouldBeginEditing).
par ce type de message, l'objet outlet vous demande votre avis. si vous êtes d'accord pour permettre la poursuite de l'action (dans ce cas une écriture de texte dans un outlet), vous renvoyez YES sinon vous renvoyez NO.
- les messages de type xxxWillyyy, ou xxxDidyyy par lequel l'outlet vous signale l'arrivée d'un évènement et à vous d'implémenter le code que vous juger utile dans le cas présent.

Dans le cas d'une délégation l'objet outlet connait son interlocuteur qui est son délégué.

Dans le cas d'une notification, l'objet outlet qui envoie la notification ne sait pas du tout quel est l'objet qui va la recevoir.

Pour cela le runtime cocoa offre 2 objets. Le NSNotificationCenter et le NSDistributedNotificationCenter.

Le notification center est une sorte de bureau de poste ou des objets viennent s'inscrire en disant "si un message de nom xxxx vous est notifié, je vous prie d'exécuter chez moi la methode yyy).

le NSNotificationCenter est un "bureau" qui est local à l'application. c'est à dire qu'il déclenche des actions (methodes) sur des objets internes à l'appli.

Le NSDistributedNotificationCenter agit au niveau de la machine et permet aux objets d'une appli d'envoyer des notifications à des objets d'une autre appli sur la même machine. En fait elle permet à deux objets dans des process (ou tasks au sens Mach) différents de communiquer.

Chaque appli a un centre de notification par défaut.
Pour y acceder faire :
NSNotificationCenter *toto=[NSNotificationCenter defaultCenter];
Voyer ces objets dans Foundation Kit pour plus de précisions.

Par exemple l'objet NSWindow envoie à son délégué le message windowShouldClose.

Dans la methode windowShouldClose du controller, vous pouvez vérifier si le contenu a été mis à jour et non sauvegardé. Dans ce cas vous répondez NO et affichez un panel de demande de sauvegarde.

De la même façon quand vous construisez des objets d'interface, IL FAUT définir les methodes que votre délégué est censé recevoir pour agir, ou des notification pour avertir les autres de votre changement.

Ce sont toutes ces choses si élégantes qui font toute la puissance de COCOA.

Les concepteurs de Java ont essayé d'implémenter des choses équivalentes. Mais ils n'ont pas la puissance et l'élégance de cocoa.
A+
Manu
 
C'est pour quand le prochain article, histoire de rassembler tout ca?
wink.gif


Moi j'en serai content
smile.gif
et je pense que je ne serai pas le seul (PowerMike, un ami à moi, et les autres ...)


 
PowerMike, je ne comprends pas ta question. En effet quand tu commences un projet de développement il faut faire ce qu'on appelle une analyse du problème que tu dois résoudre.
Dans un de mes articles j'avais conseillé de considerer dès le départ que ton application est une boite noire avec laquelle tu dialogues. C'est ce dialogue représenté par une suite de messages/réponses qui te permet d'avoir une idée assez précise de ton interface. Tout cela tu le notes en français.
Ensuite tu passes à la seconde étape celle de décortiquer chaque message et de trouver le moyen d'y répondre. Ainsi de suite. A chaque étape n'oublie surtout pas que tu raisonnes en OBJET. chaque boite noire est un objet qui reçoit des messages et qui y répond.
Quelques conseils cependant.

Notes tous les messages et donne leur un nom en français. Et explique ce qu'elle fait. Pour ça cocoa est très bien fait car il sépare (tu as du le constater), l'interface (.h) de son implémentation (.m).
N'ouble pas de noter TOUS les messages auxquels ta boite noire peut répondre.
Donne des noms à tout (boite noire, messages,etc)
Pour les Classes donne des noms comme PMxxxx (PM = Power Mike) comme sous cocoa où les classes c'est NScccc.
Pour les messages utilises des mots qui parlent et commençant par une minuscule et chaque mot commence par une majuscule. Ex: lectureDansLaBase.
etc...
J'espère avoir répondu à ta question.

A+

Manu
 
Peut-être que PowerMike voulait savoir comment créer une version localisée du programme en Français.
Pour faire une version localisée en français, il faut afficher l'inspecteur dans Project Builder, puis cliquer sur le fichier d'interface que tu veux localiser (par défaut MainMenu.nib dans le dossier Resources). Ensuite dans l'inspecteur, tu cliques sur "Localisation & Platforms", puis tu choisis "Add Localized Variant..." puis tu choisis "Français", et c'est bon.
Si tu cliques sur le triangle à côté de MainMenu.nib, tu devrais voir apparaitre "English" et "French".
Le mieux est de terminer entièrement ton interface en anglais avant de la localiser. En effet lorsque tu localises, il copie tous les éléments de ton interface en anglais dans le nouveau fichier d'interface. Donc si tu ne veux pas avoir des éléments à rajouter dans plusieurs fichiers d'interface...
Voilà, j'espère avoir compris (et répondu) à ta question
smile.gif
.