Defintion d'une classe

AlfAlfAlfAlf Membre
23:24 modifié dans API AppKit #1
Bonjour,

j'ai une question très générale sur la programmation objet (plus specifiquement en objective-C). Pour bien comprendre je vais l'illustrer avec un exemple:

Supposons que l'on définisse une classe Rectangle qui aurait trois variables:
  _ longueur
  _ largeur
  _ aire

je veux pouvoir definir à  la main les deux grandeurs "longueur" et "largeur" et que dans le même temps la grandeur "aire" se mette à  jour toute seule (ie sans que j'ai à  faire quelque chose)

Merci

Réponses

  • muqaddarmuqaddar Administrateur
    23:24 modifié #2
    Il faut utiliser un delegate genre textDidEndEditing sur tes 2 champs (longueur et largeur) et demander le calcul de l'aire (appeler sa fonction) depuis ce delegate.
  • VeillardVeillard Membre
    23:24 modifié #3
    Salut Oxitan

    Le delegate dont tu as parlé m'intéresse  :o. En revanche, je suis perdu avec les notifications quand j'ai :
    - (void)textDidEndEditing:(NSNotification *)aNotification
    


    :-\\
    Comment montrer que mon textField fait appel à  textDidEndEditing ? J'ai connecté mon textField sur le File's Owner et j'ai sélectionné Delegate, mais après, je ne sais pas quoi faire...
  • BaardeBaarde Membre
    23:24 modifié #4
    Il suffit d'ajouter la méthode textDidEndEditing à  la classe MyDocument.
    Pour savoir quel champ a été modifié :
    id posteur = [aNotification object];
    

    Et si tu as un outlet de MyDocument qui pointe vers le champ, tu peux comparer les deux :
    if([aNotification object] == textField)<br />{<br />}
    
  • décembre 2004 modifié #5
    Tu peux aussi relier une action - (IBAction)action:(id)sender au textField dans IB.

    Tu peux indiquer quand envoyer l'action.

    Tu peux faire une action communes, style changePrefs:(id)sender qui contient un code genre [self updateUI] pour éviter d'avoir 36000 actions. Si tu as besoin de savoir quand un élémentsp récis est modifier tu peux dire if (sender == monTextField) alors fait ça sinon updateUI...
  • AlfAlfAlfAlf Membre
    23:24 modifié #6
    merci pour les réponses, mais je pense par exemple au cas où j'aurais plusieurs façon de changer "longueur" et "largeur" (un NSTextField, un NSSlider, etc) dans ce cas est-ce qu'il un a delegate du genre "ifValueChange" pour qu'il sache que la valeur a changé et qu'alors il mette à  jour la tierce valeur (je ne sais pas trop où chercher dans l'aide de xcode pour trouver l'info)
  • Eddy58Eddy58 Membre
    décembre 2004 modifié #7
    dans 1103711605:

    Tu peux aussi relier une action - (IBAction)action:(id)sender au textField dans IB.

    Cette action n'est valable que quand tu valides avec Return ou par tabulation, si tu veux surveiller le textfield de près, c'est à  dire à  chaque changement de caractère, il te faut utiliser une notification...

    Sinon, IB te donne la possibilité de lier directement le textfield et le slider qui change la valeur du textfield, avec la méthode takeDoubleValueFrom: (par exemple, si ta valeur est un double). Dans IB, tu relies ton slider à  ton textfield, et ensuite dans l'info panel du slider, il faut utiliser comme target/action takeFloatValueFrom:
    Ainsi le slider est configuré pour envoyer un message au textfield quand la valeur du slider change. Puis ensuite la notification qui surveille le textfield se charge d'appeler ta méthode de calcul et de mise à  jour... :)
  • 23:24 modifié #8
    dans 1103717018:

    Cette action n'est valable que quand tu valides avec Return ou par tabulation, si tu veux surveiller le textfield de près, c'est à  dire à  chaque changement de caractère, il te faut utiliser une notification...


    Je parlais pour - (void)textDidEndEditing:(NSNotification *)aNotification....
  • AlfAlfAlfAlf Membre
    23:24 modifié #9
    je comprends tout ça mais (encore une fois :P) je pense à  quelque chose de plus general (l'exemple donné est un cas d'école). De façon generale est-ce qu'il est possible de definir plusieurs variables dans une classe et que l'une d'elles soient liées de façon intrinsèque aux autres. Dans le cas de l'exemple : aire = largeur*longueur (indépendemment de la façon dont sont attribuées largeur et longueur). Par intrinsèque j'entends : dès que largeur et longueur sont definies (par quelque façon que se soit) alors aire = largeur*longueur
  • ClicCoolClicCool Membre
    23:24 modifié #10
    Salut AlfAlf :)

    Oui c'est tout à  fait réalisable avec le KeyValueCoding et Observing des bindings.

    Plus précisemment jettes un oeil sur: Registering Dependent Keys
  • VeillardVeillard Membre
    23:24 modifié #11
    J'ai finalement utilisé :
    - (IBAction)action:(id)sender au textField
    

    et ça fonctionne parfaitement  :brule:
  • ClicCoolClicCool Membre
    décembre 2004 modifié #12
    Oui une IBAction dans un TextField fonctionnera parfaitement pour gérer une modification apportée au moyen de l'interface graphique et précisément par ce textField.
    Mais voila qui lie sacrément le Modèle à  l'interface non?

    Par ailleurs le titre de ce sujet et le premier et le dernier post d'AlfAlf me laissent penser qu'il cherchait une façon de concevoir une classe qui gère elle même l'intégrité de ses données et ce quelque soit l'origine (interface ou programmation) des modifications apportées aux variables d'instances.

    De ce point de vue je ne vois que l'utilisation d'accesseurs Key Value Compliants permettant d'utiliser le KV Observing et, accessoirement la notion d'interdépendance de propriétés (le fameux chapitre sur le Registering Dependent Keys)
  • AlfAlfAlfAlf Membre
    23:24 modifié #13
    merci pour toutes vos réponses (j'ai pas répondu avant, j'étais en vacances  8) )

    c'est exactement ça ClicCool, je vais regarder de ce pas le lien que tu m'indiques.
Connectez-vous ou Inscrivez-vous pour répondre.