[newbie][delegate]
olof
Membre
Bonjour à tous !
Pour commencer, je débarque complètement dans Cocoa. Je viens de terminer la lecture du livre 'Cocoa par la pratique'.
Ensuite, j'espère que je poste dans le bon forum...
En listant quelques documents sur le site developpeur d'Apple, j'ai eu envie de m'assurer que j'avais bien compris le concept de "delegate". Mon but est donc de créer une application Cocoa, avec une fenêtre (vide) et de faire un delegate qui interdit la fermeture de la dite fenêtre. Vu comme ça, ça m'a paru super simple. Et ben non, j'y suis même pas arrivéÂ
Voilà ce que j'ai fait :
- nouveau projet "Cocoa Application"
- ouverture du MainMenu.nib dans IB
- création d'une sous-classe de NSApplication (MyApplication)
- Définition de la custom class de File's Owner à MyApplication
- Liaison entre l'instance Window et File's Owner et connection de l'outlet Delegate
- Création des fichiers de ma classe MyApplication
MyApplication.h :
MyApplication.m :
Et bien entendu, la fenêter se ferme sans autres...
Si une âme charitable veut bien me consacrer quelques minutes ???
Merci beaucoup !!!
Pour commencer, je débarque complètement dans Cocoa. Je viens de terminer la lecture du livre 'Cocoa par la pratique'.
Ensuite, j'espère que je poste dans le bon forum...
En listant quelques documents sur le site developpeur d'Apple, j'ai eu envie de m'assurer que j'avais bien compris le concept de "delegate". Mon but est donc de créer une application Cocoa, avec une fenêtre (vide) et de faire un delegate qui interdit la fermeture de la dite fenêtre. Vu comme ça, ça m'a paru super simple. Et ben non, j'y suis même pas arrivéÂ
Voilà ce que j'ai fait :
- nouveau projet "Cocoa Application"
- ouverture du MainMenu.nib dans IB
- création d'une sous-classe de NSApplication (MyApplication)
- Définition de la custom class de File's Owner à MyApplication
- Liaison entre l'instance Window et File's Owner et connection de l'outlet Delegate
- Création des fichiers de ma classe MyApplication
MyApplication.h :
<br />#import <Cocoa/Cocoa.h><br /><br />@interface MyApplication : NSApplication<br />{<br />}<br /><br />-(BOOL)windowShouldClose:(id)sender;<br /><br />@end<br />
MyApplication.m :
<br />#import "MyApplication.h"<br /><br />@implementation MyApplication<br /><br />-(BOOL)windowShouldClose:(id)sender{<br /> NSLog(@"windowShouldClose");<br /> return NO;<br />}<br /><br />@end<br />
Et bien entendu, la fenêter se ferme sans autres...
Si une âme charitable veut bien me consacrer quelques minutes ???
Merci beaucoup !!!
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour le delegate :
Il ya des méthodes delegate pour quelques classes (je vais pas les lister ) enfin quasiment toutes.
Par exemple une fenêtre, tu connectes ta window à ton file's owner par un delegate.
Ensuite, en fouillant la doc apple, on trouve des methodes delegate pour NSWindow. Par exemple :
implémente cette méthode ds ton fichier implémentation (.m) comme ceci
Tu n'as mm pas besoin de mettre - (void)windowDidClose:(NSNotification *)n; dans ton header (.h)
Heu sinon, j'ai jms tenté de remplacer le file's owner de MainMenu.nib et je pense qu'il vaut mieux pas, ça équivaut à NSApplication je crois.
Crée carément une nouvelle classe et "instantiate" la dans ton NIB et relie la window à cette nouvelle classe par un delegate.
Voilà je viens de trouver !
Tu crées une sous-classe de NSObject
Ton header :
Ton fichier implem. :
N'oubli pas les connexions ds Interface Builder
Tu auras donc une fenêtre et ds cette fenetre : un bouton qui effectuera l'action close.
Pourquoi le "performClose:" ? Tout simplement parce qu'il est marqué ds la documentation que - (BOOL)windowShouldClose:(id)sender sera appelé que si la fenêtre est fermée, soit en quittant l'application, soit en effectuant un "performClose:"
@+
en effet, j'avais pas vu dans la doc qu'il fallait un performClose: !
Merci beaucoup !
Et sûrement à bientôt avec d'autres questions de newbie
La méthode performClose: n'est pas une obligation, tu peux trés bien t'en passer en implémentant seulement le delegate windowShouldClose.
En faites, le delegate windowShouldClose sera appelé :
- Soit quand le bouton de fermeture classique sera cliqué.
- Soit quand dans ton code tu donneras l'ordre toi-même de fermer la fenêtre via la méthode performClose. Eaglelouk a choisi l'exemple d'une action pour illustrer ceci.
Si tu as d'autres questions, n'hésites pas, et bienvenue sur OC olof.
Sinon petit détail: tu n'es pas obligé de déclarer les méthodes de delegate dans le .h. Ces méthodes sont déclarées sous forme de catégories de NSObject, donc toutes les classes les déclarent aussi.
Serais-tu sensible à son avatar par hasard?
Je t'avouerais que je suis pas un fan assidu de la Kro, mais il est aussi vrai que je ne suis pas contre de temps en temps... :P
Aucun effet
Comme expliqué dans mon 2ème post, j'ai fait ce que Eaglelouk m'a proposé, à savoir mettre un bouton dans la fenêtre qui fait un performClose:. Et ça fonctionne. Mais hier soir, je m'étais arrêté là .
Ce matin, j'ai viré ce bouton et sa méthode qui faisait le performClose: et ça marche !!!
En résumé, j'ai une classe MonDelegate, que j'ai instanciée dans IB. Lien de la fenêtre à ma classe et connexion du delegate. Et c'est tout.
Merci à tous !