NSTextField récupérer sa valeur.

chevalhackchevalhack Membre
17:37 modifié dans API AppKit #1
Bonjour à  toute l'équipe de Objective-cocoa.org,

J'aimerez en fait récupére la valeur d'un NSTextField, jusque là  pas de problème il faut utiliser la méthode -floatValue. Mais comment récupére la valeur d'un champ de texte bien précis vu que dans mon interface il y en a plusieurs. Dois-je passer par des actions, des outlets ??
Je veux juste stocker cette valeur dans une variable ou une méthode qui retourne cette valeur pour pouvoir l'attribuer a un NSRect.
Donc je possède deux champ un qui où l'on indique la hauteur et l'autre la largeur et j'aimerez bien savoir comment récupére la valeur d'un champs bien précis avec floatValue.
Je dois faire une instance de NSTextField pour pouvoir utiliser cette méthode mais ce que je ne trouve pas c'est comment relier cette instance avec un NSTextField bien précis de mon interface.

Merci d'avance pour votre réponse.

Réponses

  • schlumschlum Membre
    17:37 modifié #2
    ??

    Ben faut faire des instances de NSTextField dans Interface Builder et les relier à  des IBOutlet d'un contrôleur...
    C'est la base ça  :P Je te conseille la lecture de Cocoa par la pratique  ;)
  • chevalhackchevalhack Membre
    mars 2008 modifié #3
    Bien ce que je pensais mais je n'étais pas sur.
    Cocoa par la pratique je le lis en ce moment. ^^
    Je crois que je vais devoir relire plusieur fois certaines chose ^
  • Philippe49Philippe49 Membre
    17:37 modifié #4
    Tu récupères la totalité par
    NSString * value=[monTextField stringValue]

    Puis tu analyses ta chaà®ne par NSScanner
    NSScanner * scanner=[NSScanner scannerWithString:stringValue];
    puis scanFloat

    ou par du C
    sscanf([value UTF8String],"%f %f",&float1,&float2);

  • chevalhackchevalhack Membre
    17:37 modifié #5
    oui mais suis-je obliger de passer par un NSScanner.
    floatValue suffit non ?
  • schlumschlum Membre
    17:37 modifié #6
    dans 1206358001:

    Tu récupères la totalité par
    NSString * value=[monTextField stringValue]

    Puis tu analyses ta chaà®ne par NSScanner
    NSScanner * scanner=[NSScanner scannerWithString:stringValue];
    puis scanFloat

    ou par du C
    sscanf([value UTF8String],"%f %f",&float1,&float2);


    Ben non, il a 2 champs, il a pas les deux valeurs dans un seul  ;)
  • Philippe49Philippe49 Membre
    17:37 modifié #7
    Ben où est le problème alors ?
  • chevalhackchevalhack Membre
    mars 2008 modifié #8
    Le problème est là .
    Ok pour le controller mais après avoir créer un controleur et y intégrer les 2 outletls et avoir instancier le controlleur et relier les 2 outlets au champs. Je dois creer les fichier de ce controller. Je fais mes methodes en utilisant les NSTextField mais après pour les relier a ma vue je dois indiquer la classe appController dans maVue.h je suppose ?
    En fait c'est la que je bloque.
    Le controlleur je m'en doutais mais je savais pas comment m'y prendre après avoir fait le controlleur pour le relier à  ma vue.
    Je dois faire dans maVue.g @class appController ? ou quelque chose comme ca '?
  • Philippe49Philippe49 Membre
    17:37 modifié #9
    Je commence à  comprendre ...

    Normalement, ce serait plus simple que ton contrôleur ait un IBOutlet dirigé sur ta vue, connectée dans IB.
    Les text fields ont une action définie dans le contrôleur
    -(IBAction) sizeChange:(id)sender 
    connectées également dans IB

    A l'intérieur de ces méthodes, le contrôleur fait les transformations dans la vue
    [myView faitCecifaitCela];
  • chevalhackchevalhack Membre
    mars 2008 modifié #10
    En fait je pensais plutot à  faire ceci,

    Les outlet(fieldH et FieldW) du controleur reliés au textField.
    Puis faire 2 Méthodes dans maVue.h ??  qui s'occuperais de retourner la valeur récupérer sur le champs de text. par exemple : -(float)height { float h; h = [fieldH floatValue]; return h;}
    ces méthodes seront implanter  dans maVue.m. Mais il faudrait que la classe maVue connaisse la class controlleur donc je suppose que je dois rajouter @class appController dans maVue.h non ?
    Pour que dans la méthode drawRect: je puisse faire ceci : NSRect bounds = [self bounds]; bounds.size.height = [self height];
  • Philippe49Philippe49 Membre
    17:37 modifié #11
    Dans le contrôleur :

    Le principe stantard reste :

    -(IBAction) sizeChange:(id)sender
    {
       [maVue setHeight:[textFieldH floatValue]];
       [maVue setWidth:[textFieldW floatValue]];
       [maVue setNeedsDisplay:YES];
    }

    et si tu veux t'amuser :

    dans 1206360119:

    En fait je pensais plutot à  faire ceci,

    Les outlet(fieldH et FieldW) du controleur reliés au textField.
    Puis faire 2 Méthodes dans maVue.h ??  qui s'occuperais de retourner la valeur récupérer sur le champs de text. par exemple : -(float)height { float h; h = [fieldH floatValue]; return h;}
    ces méthodes seront implanter  dans maVue.m. Mais il faudrait que la classe maVue connaisse la class controlleur donc je suppose que je dois rajouter @class appController dans maVue.h non ?
    Pour que dans la méthode drawRect: je puisse faire ceci : NSRect bounds = [self bounds]; bounds.size.height = [self height];


    Pour faire cela, le plus simple serait que ce soit ta Custom View qui ait deux IBOutlet sur les text fields.
    Maintenant, si tu veux réaliser une connection de la vue vers le contrôleur, tu le fais en IBOutlet dans IB, ou dans
    -(void)awakeFromNib {  // du contrôleur
        [myView setValue:self forKey:@controller]; 
    }
  • chevalhackchevalhack Membre
    17:37 modifié #12
    ok merci je vais essayer cela et te dire quoi
  • chevalhackchevalhack Membre
    17:37 modifié #13
    <br />-(IBAction) sizeChange:(id)sender<br />{<br />&nbsp;  [maVue setHeight:[textFieldH floatValue]];<br />&nbsp;  [maVue setWidth:[textFieldW floatValue]];<br />&nbsp;  [maVue setNeedsDisplay:YES];<br />}
    


    Ok mais maVue est une classe custom qui herite de NSView. Donc je ne peux pas l'utiliser de cette manière vu que setHeight et setWidth dans ton cas sont des methode d'instance ainsi que setNeedsDisplay.
    Moi ce n'est pas une instance maVue mais bien une classe.
    Comment pourrais-je m'y prendre dans ce cas ??
    c'est pour cela que je voulais faire comme j'avais dit plus haut
  • Philippe49Philippe49 Membre
    17:37 modifié #14
    Dans ton projet XCode, il faut rajouter une classe MyView . (choisir Objective NSView subClass après add>NewFile)

    @interface MyView:NSView
    {
      CGFloat height,width;
    }
    -(void) setHeight:(CGFloat) aFloat;
    -(void) setWidth:(CGFloat) aFloat;
    @end

    Dans IB, choisir MyView dans le panel "identity" pour la customView. (le taper dans le champ ad-hoc)

  • Philippe49Philippe49 Membre
    17:37 modifié #15
    Dans MyView.h, tu auras une architecture élémentaire toute prête
    - (id)initWithFrame:(NSRect)frame {
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code here.
        }
        return self;
    }

    - (void)drawRect:(NSRect)rect {
        // Drawing code here.
    }
  • Philippe49Philippe49 Membre
    17:37 modifié #16
    En résumé :

    Dans IB
    Une custom view, instance de la classe MyView
    Deux TextFields
    et dans le MainMenu.nib une instance du contrôleur

    Dans XCode
    Des fichiers Controller.h,Controller.m,MyView.h,MyView.m
    dans Controller.h des IBOutlet sur les text fields, et sur la vue

    Connections dans IB
    Les outlets, les actions des TextFields
  • chevalhackchevalhack Membre
    17:37 modifié #17
    oui ok mais tu ne m'indique pas ce que je dois faire dans l'action changeSize ??
    La classe myView et les fichiers etait deja fait depuis longtemps c'est juste le changement de taille que je dois effectuer et pourquoi mets-tu CGFloat au lieu de float ???
  • Philippe49Philippe49 Membre
    mars 2008 modifié #18
    dans 1206365077:

    oui ok mais tu ne m'indique pas ce que je dois faire dans l'action changeSize ??
    La classe myView et les fichiers etait deja fait depuis longtemps c'est juste le changement de taille que je dois effectuer et pourquoi mets-tu CGFloat au lieu de float ???

    -(IBAction) sizeChange:(id)sender
    {
       [maVue setHeight:[textFieldH floatValue]];
       [maVue setWidth:[textFieldW floatValue]];
       [maVue setNeedsDisplay:YES];
    }

    [maVue setNeedsDisplay:YES] indique que la vue doit être rafraà®chie, et cela a pour conséquence l'appel automatique de la méthode drawRect:(NSRect) rect (entre autres) , rect correspondant au rectangle recouvert par la vue.


    dans 1206365077:

    pourquoi mets-tu CGFloat au lieu de float ???

    Parce que plus haut dans tes posts tu as mis CGFloat.
    Mais tu peux mettre float cela marche aussi bien.

    [EDIT] J'ai mélangé avec un autre post auquel je répondais en même temps, .. , sorry,   ::) mets float.
  • chevalhackchevalhack Membre
    17:37 modifié #19
    Ha oui j'ai oublier de dire mon application est basée sur un document cela change quelque chose à  ce niveau ou non ??
    Puis dans l'implementation des methodes setHeight et setWidth je met quoi ???
    et pourquoi tu met des float height, width en variable d'instance j'en fait quoi de ceux lÀ ????
  • Philippe49Philippe49 Membre
    17:37 modifié #20
    dans 1206366541:

    Ha oui j'ai oublier de dire mon application est basée sur un document cela change quelque chose à  ce niveau ou non ??

    ;D ;D
    Tu tiens vraiment à  l'option Document-Based Application ?
    Perso, je commencerais pas par là  pour dessiner simplement dans une vue  ...
    mais on peut, si tu veux, dans ce cas c'est l'instance de MyDocument qui sert de contrôleur pour la vue ...

    dans 1206366541:

    Puis dans l'implementation des methodes setHeight et setWidth je met quoi ???
    et pourquoi tu met des float height, width en variable d'instance j'en fait quoi de ceux lÀ ????

    ben
    -(void) setHeight:(float) aFloat{
    height=aFloat;
    }

    dans 1206366541:

    et pourquoi tu met des float height, width en variable d'instance j'en fait quoi de ceux lÀ ????


    Dans ta méthode drawRect, ces valeurs seront utilisables pour faire un jouli petit dessin

  • chevalhackchevalhack Membre
    17:37 modifié #21
    HA ok donc je ne dois pas faire de controlleur, myDocument est déjà  un controlleur si j'ai bien compris.
    Un jouli petit dessins ne m'interesse pas moi je veux juste modifier la tailler du NSRect
  • Philippe49Philippe49 Membre
    17:37 modifié #22
    dans 1206368871:

    HA ok donc je ne dois pas faire de controlleur, myDocument est déjà  un controlleur si j'ai bien compris.

    Dans une Document-Based Application, un contrôleur dans MainMenu.nid contrôle l'ensemble des documents ouverts et l'application en général, et chaque document est contrôlé par une instance de MyDocument.
    Bien foutu, Non ?  8--)

    dans 1206368871:

    Un jouli petit dessins ne m'interesse pas moi je veux juste modifier la tailler du NSRect

    Si l'art n'a aucune prise sur toi ...  :-\\ ::)
    De quel rectangle parles-tu :un rectangle définissant les contours de ta vue ? un rectangle dessiné à  l'intérieur de ta vue ?
    Bref quoiqu'tu veux ? :o



  • chevalhackchevalhack Membre
    mars 2008 modifié #23
    ;) l'art m'interesse mais avant de faire une oe“uvre on commence tout petit ^^

    J'ai mon zone Custom View auquel j'ai attribuer le classe MyView.
    Dans MyView.m dans la méthode drawRect, j'ai dessiner un NSRect : NSRect bounds = [self bounds];.
    Le but de mon excercie est de faire une application basée sur un document et que je puisse redimensionné cette zone en indiquant la taille dans un textField.
    Donc à  partir d'un document comment dois-je m'y prendre pour pouvoir redimenssioner ce NSRect à  partir des valeurs inscrite dans le textField. C'est pas complexe mais quelque chose m'échappe ?
    J'aimerez arriver à  ce que dans la méthode NSRect je puisse faire ceci bounds.size.height = [self unemethode retournantLaValeurDuChampDeTexte]; tout ca se trouve dans drawRect de MyView.m
    dois-je faire une controller comme indiquer précédement, ou MyDocument.h suffit, enfin voila quoi si tu peux m'aider cela serait gentil merci ;)
    Juste récupere cette valeur et la mettre comme retour dans une méhode que je puisse utiliser dans MyView.m
  • Philippe49Philippe49 Membre
    mars 2008 modifié #24
    Voici
  • chevalhackchevalhack Membre
    17:37 modifié #25
    Parfait c'est ce que je m'appretais à  faire :D c'est juste que c'est parce que je faisait un controller à  part alors que c'étais myDocument. ;)
Connectez-vous ou Inscrivez-vous pour répondre.