importer une variable d'une autre class
Fred20
Membre
Bonjour
Je débute sous cocoa et je bloque sur un pbl. j'ai une class MyDocument et une class MaClass (je sais, pas trop originale !!). Suite à des futurs calculs réalisés dans MaClass, je veux les importer dans MyDocument pour les afficher.
Dans MyDocument.m, j'ai fait :
-(IBAction) visuTest /sad.png' class='bbc_emoticon' alt=':(' />id)sender
{
int i = 1;
i=/color]essaiMaClass[color=#000000] [/color][color=#31595d]getEssaiTest[/color][color=#000000;
[valTest setIntValue:i];
}
et dans MaClass.m j'ai fait
-(int) getEssaiTest
{
return 10;
}
Mais bien sûr, ça ne marche pas.
sachant également que j'ai fait dans MyDocument.h
#import "MaClass.h"
@interface MyDocument : NSDocument
{
MaClass *essaiMaClass;
}
Que dois je faire /huh.gif' class='bbc_emoticon' alt='???' />
Merci d'avance
Je débute sous cocoa et je bloque sur un pbl. j'ai une class MyDocument et une class MaClass (je sais, pas trop originale !!). Suite à des futurs calculs réalisés dans MaClass, je veux les importer dans MyDocument pour les afficher.
Dans MyDocument.m, j'ai fait :
-(IBAction) visuTest /sad.png' class='bbc_emoticon' alt=':(' />id)sender
{
int i = 1;
i=/color]essaiMaClass[color=#000000] [/color][color=#31595d]getEssaiTest[/color][color=#000000;
[valTest setIntValue:i];
}
et dans MaClass.m j'ai fait
-(int) getEssaiTest
{
return 10;
}
Mais bien sûr, ça ne marche pas.
sachant également que j'ai fait dans MyDocument.h
#import "MaClass.h"
@interface MyDocument : NSDocument
{
MaClass *essaiMaClass;
}
Que dois je faire /huh.gif' class='bbc_emoticon' alt='???' />
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
1) Aller te présenter dans la section dédiée du forum, pour ton premier post, et pour aussi qu'on ait une idée de ton niveau, ton bagage, etc
2) Editer ton message et utiliser la balise CODE autour du code que tu as mis dans ton message, pour le formatter correctement et qu'il puisse être lisible
3) Instancier ta classe pour pas qu'elle soit nil quand tu lui envoies le message.
Donc vola, c'est fait, je me suis présenté sur le forum et bien sûr je penserai à utiliser les balises.
Pour le 3e point, tu dis qu'il faut instancier ma classe ... en d'autres termes, ça veut dire quoi ? et du coup, on fait ça comment /huh.gif' class='bbc_emoticon' alt='???' /> !!
merci de me donner ce coup de pouce.
Bon plus sérieusement:
http://www.cocoalab.com/BecomeAnXcoder.pdf
Bon l'anglais n'est pas mon fort même si j'ai bien compris que la majeure partie des réponses sont en anglais mais je vais fouiner
Je te conseille donc de bien prendre ton temps pour lire un bon bouquin (papier ou PDF) qui explique les bases de la POO et d'Objective-C pour avoir des bases solides avant d'avancer, sans ça beaucoup de termes comme "instancier une classe" ne vont pas te parler et tu vas être frustré à ne pas pouvoir avancer. Une fois ces concepts de base bien compris et maà®trisés, cela te sera alors bien plus facile pour la suite.
Le même en français si tu préfères; http://www.cocoalab.com/?q=BecomeAnXcoder-Francais
Je ne sais pas s'ils ont tous été traduits, mais les livres d'Aaron Hillegass sont vraiment excellents pour comprendre l'objective-C et Cocoa.
j'ai donc suivi vos conseil à propos d'instancier ma classe. En effet, il me semble que j'avais oublié le alloc. Donc voici ma correction mais ça ne marche pas non plus. Petit rappel, je cherche simplement pour l'instant à faire varier le contenu d'un objet de MyDocument ( ici valTest) à partir de MaClass afin de récupérer cet objet modifier dans MyDocument par la suite. En fait, je chercherai par la suite à récupérer la position d'un clic souris (à partir de MaVue) et l'afficher grâce à MyDocument .
Ceci étant, lorsque je lance j'obtiens ce message (anormal!) :
Loading 37448 strack frames ... (2%)
voici MaCLass. h et .m :
Ma classe MaClasse.h :
ma Classe MaClass.m
J'ai du ratter un truc ! Mais quoi /huh.gif' class='bbc_emoticon' alt='???' />?
Merci d'avance
Il faut appeler le init parent ([super init])... qui te retourne, comme tout "init", potentiellement un nouvel objet.
Il faut donc écrire :
Je sais pas si c'est ce qui fait que tu as une boucle infinie dans tes appels (car c'est bien ça qui se passe vu qu'il te dit quand tu debug qu'il charge un nombre colossal de "stack frames" ce qui veut dire que tu as une pile d'appels colossale, (méthode 1 qui appelle méthode 2 qui appelle méthode 3... qui appelle méthode 7000, qui appelle méthode 7001...) ce qui en général est dû à des appels récursifs (méthode A appelle méthode A... qui donc rappelle méthode A... de façon infinie), mais bon dans tous les cas il faut mieux au moins corriger cette méthode d'init.
je regarde et te tiens au courant
Je sais récupérer ces valeurs à la condition que je clique sur un bouton. En revanche, comment faut il faire pour les récupérer automatiquement, c'est à dire que chaque fois que ma souris bouge, les nouvelles coordonnées sont envoyées
Merci d'avance
On peut récupérer la position de la souris à tout moment avec:
[font=courier new,courier,monospace]NSPoint mousePoint=[NSEvent mouseLocation]; // screen coordinates[/font]
ou encore
[font=courier new,courier,monospace]NSPoint mousePoint=[[maVue window] mouseLocationOutsideOfEventStream]; // window coordinates[/font]
Mais la vraie question est: pourquoi faire ?
Oui mais pour faire quoi ? (bis)
car je soupçonne que c'est une sous classe de NSView qu'il faut créer ...
Je soupçonne quand même qu'il te manque des bases de la POO.
Voici comment je m'y prendrais à peu près :
Pour respecter le paradigme MVC (Model - View - Controller), je te propose de créer une classe MyDatas (Model) et une classe MyView (la view qui répondra aux clics). Le controller sera l'instance de MyDocument.
Voici MyDatas
Comme tu l'as compris, une instance de MyData devra être créée : soit on créée un nouveau fichier et elle est allouée et initialisée par défaut (méthode init appelée), soit il s'agit d'un fichier que l'on ouvre, et il faut désarchiver via la méthode initWithCoder: (Ce n'est pas toi qui l'appelle directement cette méthode). Il faut aussi évidemment pouvoir archiver les données d'où la méthode encodeWithCoder:
Ensuite, il faut créer la sous-classe de NSView "MyView" qui répondra à l'événement mouseDown:
La vue a un outlet qui permet de maintenir un pointeur vers l'instance de MyDocument. (Ne pas oublier de le connecter dans IB...). La méthode mouseDown: a été implémentée de manière à récupérer le point et d'informer MyDocument de l'événement avec le point en paramètre.
Voici enfin MyDocument :
les propriétés x et y ont été créées pour permettre à 2 textView d'afficher la valeur des coordonnées.
Il faut informer des changement de x et y lors de l'accès aux données d'où les willChangeValue et didChangeValue pour que les textView soient mise à jour. (On aurait aussi pu créer 2 outlets et envoyer le message setFloatValue aux textView ).
Dans IB (MyDocument) , tu as évidemment compris que tu glisses une NSView, tu indiques dans l'inspecteur que la classe est MyView, tu connectes l'outlet de la Vue à File's owner (MyDocument)
Tu glisses 2 textView, accompagnées de leur numberFormatter, et tu "bind" value à MyDocument , keyPath "x" pour l'un et keyPath "y" pour l'autre.
Normalement, lorsque tu compiles et lances le projet, tu dois pouvoir cliquer sur la vue => les textView indiquent les coordonnées à chaque clic. Tu dois pouvoir enregistrer un fichier et l'ouvrir.
J'espère que ceci te sera utile.
Mon problème est donc : comment ,lorsque je clique sur ma souris, repérer le click et récupérer mon NSPoint dans MyDocument.
Voila mon objectif et donc mon problème ...
Merci de votre aide
Donc ma 1ere question est : pourquoi lorsque je clique sur mon bouton, mes x et y sont remis à zéro alors que lorsque je clique sur mon carré tout fonctionne ?(selon la console)'
2e question (une fois la première résolue) comment afficher directement mes résultat ?
Mon exemple n'utilise pas les @property, je ne les maitrise pas encore assez !!
Voici les codes :
et
merci d'avance
un NSDocument créé dans une vue /crazy.gif' class='bbc_emoticon' alt=' ' />
Faut partir sur des bases saines: dans Xcode créér un projet Document based !
Merci encore
A toi de faire ce lien dans IB si tu le souhaites.
Merci
Le code que tu as posté est comme qui dirait ... bordélique ! Je pense qu'avant toute ligne de code écrite, tu devrais prendre un papier et un crayon pour structurer le projet : de quels genre d'objets ai-je besoin ? qui doit causer avec qui (donc qui doit maintenir un pointeur vers quel autre objet ?) quelles variables d'instances ? quelles méthodes ?...
Une fois ceci fait, alors on peut allumer le mac et lancer xcode car on sait où on va.
La POO c'est du design en fait !
Je te mets le projet test que je t'ai proposé en pj.
Bon, j'ai quelques questions sur ton code :
- Dans MyDocument :
- tu fais un @property (floa)t x sans déclarer au préalable x. C'est possible ça ??
- peux tu m'expliquer la méthode "laVueViensDEtreCliquee" : j'ai compris que tu fais passer les valeur du click mais à quoi servent willChangeValueForKey et didChangeValueForKey et également à quoi sert [laVue setNeedsDisplay:YES] ??
- tu fais un alloc init de "lesDonnées" mais pas de "laVue" ??
- Dans MaVue :
- tu ne fais pas d'alloc init de monDocument : pourquoi ?? si je comprends bien MyDocument *monDocument sert simplement à récupérer les méthodes de monDocument ??
- Dans MyData :
- peux tu m'expliquer "encodeWithCoder" , "decodePointForKey" et "encodePoint" /huh.gif' class='bbc_emoticon' alt='???' />
Je sais ça fait beaucoup de question, mais tu m'envois un truc génial d'un coup !!!
merci d'avance
Moi, la question que je te pose est pourquoi aurais-tu besoin de récupérer les coordonnées de la souris dans ton NSDocument ?
Tu as raison, c'est mal. Ne déclare que les accesseurs -(float)x et -(float)y, mais pas la propriété. (en debug, ça marche avec la propriété mais pas en release...)
Et bien, dans cette méthode, appelée par la NSView lorsqu'elle traite l'événement "mouseDown:", j'obtiens le point cliqué, dans les coordonnées de la vue. De ce fait, je dois changer le modèle de données pour que "lesDonnees.lePoint" devienne le nouveau point. J'informe le mécanisme "key value coding" que x et y ont été modifiés (willChange, didChange) cf Key-Value-Coding dans la doc (de c fait, les textView vont être informées du changement car elles sont "bindées" aux clefs x et y de MyDocument : elles vont donc aller rechercher les nouvelles valeurs). le setNeedsDisplay sert à informer que la vue doit être redessinée. (ici, la vue dessine un cercle centré sur le point).
NON : La vue sera instanciée lorsque le fichier créé dans IB (MyDocument) sera désarchivé !
J'aurai pu aussi créer une instance de MyDatas dans IB, je ne l'aurais alors pas instancié dans l'init de MyDocument.
J'aurai pu ne pas "glisser" une View dans IB, et créer par le code la Vue : je l'aurais alors instanciée avec un alloc initWithFrame:(rectangle).
Parce que je ne veux pas créer une nouvelle instance de MyDocument, j'en ai déjà une ! je veux juste connaà®tre l'adresse mémoire de cette objet. Je veux donc un pointeur vers cet objet. l'IBOutlet me permet de l'obtenir.
hein ? leDoc est un pointeur vers l'instance de MyDocument, point ! donc par là même, permet d'acceder à ses propriétés et ses méthodes.
Pour un document-based application, les classes de la couche "Model" doivent implémenter ces méthodes pour être NSCoding compliant. cf doc pour ce protocole. De cette manière, lors de l'encodage pour archivage du document du "rootObject" ici "lesDonnees", on indique ce qui doit être archivé pour chaque objet, en l'occurence ici, un unique NSPoint. on indique donc dans ces méthodes qu'il faut encoder un point (encodePointForKey) . voir la doc sur l'archivage.
Je pense qu'il faut que tu lises bien la doc. Si tu es nul en anglais ... euh .. bien .. bon courage !!