[Débutant] 2 problèmes

CrazyJoCrazyJo Membre
23:46 modifié dans API AppKit #1
Bonjour,

Voilà  j'essaie d'apprendre l'Obj-C/Cocoa et j'ai deux petites questions .

1. Comment afficher/cacher une fenêtre ?

J'ai essayé ceci : dans mon .h j'ai
[...]IBOutlet id MainWindow;[...]
et dans le .m j'ai cela :
<br />- (IBAction)UserName:(id)sender<br />{<br />[UserName setStringValue:[code][UserName1 stringValue]];<br />[UserNameScore setStringValue:[UserName1 stringValue]];<br />[MainWindow showWindow: self]; // la ligne qui embête <br />}

mais cette ligne ne fonctionne pas et il n'indique même pas une erreur ou un warning... l'objet est connecté à  la fenêtre

2.Comment vérifier si le NSTextField est plein, si non le dire à  l'utilisateur.

j'ai tenté ceci :
- (IBAction)UserName:(id)sender<br />{<br />[UserName setStringValue:[UserName1 stringValue]];<br />[UserNameScore setStringValue:[UserName1 stringValue]];<br />[MainWindow showWindow: self]; <br />if (UserName1 isEqualToString:@&quot;&quot;) <br />[UserName setStringValue:@&quot;Complete your name here&quot;];<br />}<br />
mais là  y'a une error mais ce n'est sans doûte pas une surprise.


J'ai fait des recherches sur le forum mais je n'ai trouvé que des lignes de code sans explications.  J'espère avoir bien cherché  :crackboom:-

Merci d'avance pour vos réponses

[/code]

Réponses

  • Eddy58Eddy58 Membre
    23:46 modifié #2
    Tout d'abord, utilises une minuscule pour la première lettre des variables.
    1) Montrer la fenêtre :
    <br />[mainWindow orderFront:self];<br />
    

    Comme ça c'est mieux, si tu veux ta fenêtre prête à  utiliser en la faisant revenir devant :
    <br />[mainWindow makeKeyAndOrderFront:self];<br />
    

    Cacher la fenêtre :
    <br />[mainWindow orderOut:self];<br />
    


    2) Ca doit être bon, en mettant les crochets :
    <br />if ([userName1 isEqualToString:@&quot;&quot;]) <br />[userName setStringValue:@&quot;Complete your name here&quot;];<br />
    


    3) Bienvenue sur OC !!! J'espère que tu vas quand même payer ta tournée générale par cette chaleur ! :)  :p :p
  • CrazyJoCrazyJo Membre
    août 2007 modifié #3
    1. Merci pour ta réponse . C'est ok maintenant
    2. Malgrès l'ajout des crochets ça ne marche pas . J'ai changé l'ordre par contre. Voici le code maintenant : 
    {<br />if ([userName1 isEqualToString:@&quot;&quot;])<br />[userName1 setStringValue:@&quot;Complete your name here&quot;];<br />else<br />[userName setStringValue:[userName1 stringValue]];<br />[userNameScore setStringValue:[userName1 stringValue]];<br />[mainWindow makeKeyAndOrderFront:self];<br />[firstWindow orderOut:self];<br /><br />}
    
    Dans la console ça indique ceci lorsque je clique sur le bouton pour déclancher cette action : -[NSTextField isEqualToString:]: selector not recognized

    3. Merci pour l'acceuil . et je veux bien payer une tournée virtuelle  :p :p   :P

    edit HS : C'est cool le titre : Consommateur de chocolat puisque je suis Suisse :)
  • Philippe49Philippe49 Membre
    23:46 modifié #4
    dans 1187208286:

    Dans la console ça indique ceci lorsque je clique sur le bouton pour déclancher cette action : -[NSTextField isEqualToString:]: selector not recognized


    Pour atteindre la chaà®ne de caractères du NSTextField : [myTextField stringValue];

    Pour obtenir l'info, commencer par lire la doc sur NSTextField. Un moyen pour obtenir cete page est de sélectionner NSTextField dans XCode, et utiliser help>Find Selected text In Api

    Comme l'info voulue n'est pas dans cette page, elle peut l'être dans une sur-classe.
    Regarder en début de cette page, on apprend que NSTextField est une sous-classe de NSControl, et dans cette page, on trouve stringValue

    Bienvenu aux nouveaux  :p :p :p :p :p
  • CrazyJoCrazyJo Membre
    23:46 modifié #5
    Ca marche merci  <3 <br />mais j'ai une autre question:

    [size=10pt][shadow=red,left]C[/shadow][/size]omment faire si je veux connecter le même outlet à  deux NSView ou plus ?
  • schlumschlum Membre
    23:46 modifié #6
    dans 1187262501:

    Ca marche merci  <3 <br />mais j'ai une autre question:

    [size=10pt][shadow=red,left]C[/shadow][/size]omment faire si je veux connecter le même outlet à  deux NSView ou plus ?



    Ca n'a pas de sens... Un outlet correspond à  un objet.

    Par contre, Il y a un objet NSMatrix qui peut contenir plusieurs cellules...
  • CrazyJoCrazyJo Membre
    23:46 modifié #7
    ok merci.


    J'ai des Warnings dans cette partie du code :
    - (IBAction)rockButton:(id)sender<br />{<br />	[userChoice setImage:_PictureR];<br />	[self action]; //ICI EST LE WARNING<br />}<br />
    
    le self action:
    -(void)action<br />{<br />NSBeep();<br />}
    
    Si on lance l'app tout fonctionne mais j'aimerais quand même savoir pourquoi il y ce Warning qui dit : "MainActions" may not respond to "-action" MainActions étant le nom de l'objet. Comment régler cela ?
  • schlumschlum Membre
    23:46 modifié #8
    Il doit manquer dans le .h...
  • MulotMulot Membre
    23:46 modifié #9
    Ou sinon ta méthode action est déclarée après ta méthode rockButton. Il suffirait alors de l'implémenter avant ton autre méthode où elle est utilisée.

    Ca m'arrive dans mon projet, ce genre de chose, et je trouve que c'est assez pénible, qu'il ne puisse pas lire le code de manière globale et non ligne par ligne.
  • Philippe49Philippe49 Membre
    23:46 modifié #10
    dans 1187296383:

    Ou sinon ta méthode action est déclarée après ta méthode rockButton. Il suffirait alors de l'implémenter avant ton autre méthode où elle est utilisée.

    Ca m'arrive dans mon projet, ce genre de chose, et je trouve que c'est assez pénible, qu'il ne puisse pas lire le code de manière globale et non ligne par ligne.


    Non l'ordre des déclarations n'importe pas si on prend soin de séparer le .h et le .m
  • CrazyJoCrazyJo Membre
    23:46 modifié #11
    dans 1187295364:

    Il doit manquer dans le .h...

    Effectivement c'était cela.merci
    roh la gaffe  :-\\
  • MulotMulot Membre
    23:46 modifié #12
    dans 1187299084:

    dans 1187296383:

    Ou sinon ta méthode action est déclarée après ta méthode rockButton. Il suffirait alors de l'implémenter avant ton autre méthode où elle est utilisée.

    Ca m'arrive dans mon projet, ce genre de chose, et je trouve que c'est assez pénible, qu'il ne puisse pas lire le code de manière globale et non ligne par ligne.


    Non l'ordre des déclarations n'importe pas si on prend soin de séparer le .h et le .m


    C'est étrange parce que chez moi j'ai juste déplacé une méthode "au dessus" d'une autre qui l'appellait, et le warning "may not respond to maMethode" a disparu !

    De plus, je fais moin .h en premier, puis je copie colle les entêtes du .h dans mon .m pour être sur de ne pas en oublier.
  • Philippe49Philippe49 Membre
    23:46 modifié #13
    dans 1187338522:

    C'est étrange parce que chez moi j'ai juste déplacé une méthode "au dessus" d'une autre qui l'appellait, et le warning "may not respond to maMethode" a disparu !


    un mic-mac dans les #import ?
  • Philippe49Philippe49 Membre
    23:46 modifié #14
    dans 1187338522:


    je copie colle les entêtes du .h dans mon .m pour être sur de ne pas en oublier.


    euh  ???
    #import "maClasse.h"  fait déjà  cette copie et permet au compilateur d'éviter de dupliquer les déclarations.
  • MulotMulot Membre
    23:46 modifié #15
    En fait je me suis mal exprimé.

    C'est juste que je copie colle les entêtes de mon .h dans le .m, mais je les modifie. Je fais juste cette manip pour être sur de ne pas en oublier.

    du genre dans mon point .h si j'ai

    <br />- (Account*) accountAtIndex: (int) index ;<br /><br />- (NSString*) firstName ;<br />
    


    Je copie colle ces deux lignes dans mon .m, puis je les modifies en enlevant le point virgule que je rempalce par deux accolades.

    <br />- (Account*) accountAtIndex: (int) index {}<br /><br />- (NSString*) firstName {}<br />
    


    Comme ça je gagne du temps, je ne me trompe pas dans la recopie éventuelle d'un nom de méthode.

    Et pour le warning, c'était ma faute, je trouvais ça étrange quand même qu'il faille implémenter dans l'ordre ! J'avais en effet rajouté un paramètre à  ma méthode qui était appelée par le notification center, alors qu'elle n'avait pas de paramètre dans le .h.

    Merci beaucoup !
  • Philippe49Philippe49 Membre
    23:46 modifié #16
    dans 1187350795:


    Je copie colle ces deux lignes dans mon .m, puis je les modifies en enlevant le point virgule que je rempalce par deux accolades.


    Oui, je fais de même
  • AliGatorAliGator Membre, Modérateur
    23:46 modifié #17
    En fait on peut dire que l'ordre des déclarations importe, et donc on peut se permettre (pas top conseillé pour la lisibilité, mais faisable et ça fonctionne) de ne pas les mettre dans le .h si on les écrit dans l'ordre, définissant bien sûr les méthodes avant qu'elles soient utilisées.

    Le principal c'est que lorsqu'on appelle une méthode dans du code, elle ait été précédemment déclarée ou définie. Dans le .h (dont le code est inclus avant le contenu du .m via le #import) ou dans le .m, au choix.

    - Ce qui fait que si on déclare tout dans le .h, on a ainsi toutes les billes et on peut appeler ce qu'on veut dans l'ordre qu'on veut ensuite, puisqu'il connait la signature des méthodes grace au .h. On est d'ailleurs obligé de fare ça comme ça si on a des méthodes qui s'appellent l'une-l'autre par exemple.
    - Mais si on appelle une méthode qui n'est pas déclarée dans le .h mais déclarée (voire définie) plus haut dans le .m, ça marche aussi (c'est juste un peu moins "conventionnel")

    Voilà  pourquoi dans les 2 cas que vous avez testé dans vos posts, les 2 solutions fonctionnaient, du moment que la méthode appelée soit AVANT dans le .m ;)
  • schlumschlum Membre
    août 2007 modifié #18
    Je vous conseille de mettre les déclaration dans le .h, car je crois que Xcode recherche dedans pour l'auto-complétion...

    En plus, le jour où vous aurez besoin d'appeler les fonctions / méthodes d'une autre fonction / classe, vous comptez faire comment ?
  • Philippe49Philippe49 Membre
    23:46 modifié #19
    dans 1187382346:

    Je vous déconseille de mettre les déclaration dans le .h, car je crois que Xcode recherche dedans pour l'auto-complétion...


    Tu veux dire dans le .m, je suppose ?
  • Philippe49Philippe49 Membre
    23:46 modifié #20
    dans 1187367959:

    (pas top conseillé pour la lisibilité, mais faisable et ça fonctionne)

    le C, et donc l'objective C est très permissif.
    Mais il ne faut pas utiliser ces permissivités car elles compliquent tout, sans apporter grand chose ...
  • schlumschlum Membre
    23:46 modifié #21
    dans 1187385529:

    dans 1187382346:

    Je vous déconseille de mettre les déclaration dans le .h, car je crois que Xcode recherche dedans pour l'auto-complétion...


    Tu veux dire dans le .m, je suppose ?


    Oui, bien sûr, je conseille de mettre dans le .h ou je déconseille de mettre dans le .m, on s'est compris :D
Connectez-vous ou Inscrivez-vous pour répondre.