Problemes de débutant ...

ldfaldfa Membre
01:29 modifié dans API AppKit #1
Bonjour à  tous ...
J'ai pas réussi à  donner un nom à  mes 2 problèmes ....
J'ai joint  un projet mettant en évidence mes problèmes, c'est plus simple que de longues explications.

Dans les traces de mon application:
- j'affiche l'adresse de ma sous-class d'une NSImageView, et dans mon 'controleur' j'affiche l'adresse de l'outlet.
Je n'obtiens pas la même adresse, ce qui me dérange un peu ...
-j'affiche une variable d'instance de MyImageView qui est initialisée pendant 'initWithFrame' mais je n'arrive pas à  récupérer cette valeur par mes 'accessor methode'

Un dernier problème, je comprends pas pourquoi il faut que j'instantiate' dans IB ma sous classe pour que la méthode 'initWithFrame'  soit appelé ....

Bon voila, et merci pour les éclaircissements dont j'ai grand besoin ....

[Fichier joint supprimé par l'administrateur]

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    01:29 modifié #2
    dans 1166638617:

    Un dernier problème, je comprends pas pourquoi il faut que j'instantiate' dans IB ma sous classe pour que la méthode 'initWithFrame'  soit appelé ....


    Je répond qu'à  cette question car je crois avoir la réponse et j'ai pas le temps dans l'immédiat pour les autres questions...

    Donc, une classe doit être instanciée pour existée. Quand tu instancie une classe, tu créer un objet.
    Donc ta classe, soit tu l'instancies (allocation + init) à  partir d'un de tes objets perso, soit dans IB ce qui a pour effet d'instancier ta classe automatiquement au désarchivage du .nib.

    a+
  • ldfaldfa Membre
    01:29 modifié #3
    dans 1166640120:

    Donc, une classe doit être instanciée pour existée. Quand tu instancie une classe, tu créer un objet.
    Donc ta classe, soit tu l'instancies (allocation + init) à  partir d'un de tes objets perso, soit dans IB ce qui a pour effet d'instancier ta classe automatiquement au désarchivage du .nib.

    Merci pour ta réponse LeChatNoir.
    Mais cela répond à  ma question pour une sous classe d'un object non graphique ...
    Dans le cas d'une sous classe NSImageView ... mon objet semble exister car il est present dans ma fenetre à  l'execution même si je l'instancie pas ....
    Mais il y a peut être seulement la palette .... je vais vérifier avec un bouton
  • ldfaldfa Membre
    01:29 modifié #4
    dans 1166648990:

    Mais il y a peut être seulement la palette .... je vais vérifier avec un bouton

    Je me réponds à  moi même, après vérification avec une sous classe de NSButton, il fonctionne dans la fenêtre même si j'instancie pas ma sous classe .... Bon j'ai seulement un object NSButton et pas un object MyButton.... mais cela m'échape un petit peu.


  • LeChatNoirLeChatNoir Membre, Modérateur
    01:29 modifié #5
    Ben si tu mets une NSImageView dans ta fenêtre sous IB, tu instancie effectivement un objet NSImageView.
    Partant de là , dans IB, tu peux déjà  lui affecter une image.
    Si ce comportement simple te convient, alors ça s'arrête là .
    Mais si tu veux modifier le comportement de cette ImageView, alors tu vas être obligé de définir une classe à  toi qui hérite en principe de NSImageView (comme ça tu hérite de toutes les méthodes et attributs de cette classe).

    Et si tu veux que ta sous classe soit utilisée plutot que la classe standard, alors, il te faut l'indiquer à  IB.
    Pour ça, tu vas dans les propriétés de ta NSImageView sous IB et tu choisis "Custom Class". Là  tu choisis ta classe perso (faut faire glisser le .h avant) et l'objet "instanciera" donc ta classe. Ta méthode sera alors appelée (initWithFrame).
    Même pas besoin de forcer l'instanciation.

    a+
  • 01:29 modifié #6
    Pour que initWithFrame soit appelé, il faut que l'objet ajouté dans IB soit une "Custom View" où la classe est redéfinie. Si tu ajoutes une NSImageView et que tu indiques une sous classes, elle sera initialisée avec initWithCoder:.
  • ldfaldfa Membre
    01:29 modifié #7
    dans 1166656128:

    Pour que initWithFrame soit appelé, il faut que l'objet ajouté dans IB soit une "Custom View" où la classe est redéfinie. Si tu ajoutes une NSImageView et que tu indiques une sous classes, elle sera initialisée avec initWithCoder:.

    Merci Renaud
    Effectivement, si je surcharge mouseDown: instancié ou pas, elle est appelée. Bon cela me rassure, juste initWithFrame: qui n'est pas appelé dans ce cas !!!!
    Ou trouver des infos sur le sujet, car cela me semble pas intuitif ....

    Si quelqu'un à  des idée pour mes autres problèmes
  • ldfaldfa Membre
    01:29 modifié #8
    dans 1166688079:

    Si quelqu'un à  des idée pour mes autres problèmes


    Bon finalement c'était la source de l'ensemble de mes problèmes ....
    J'avais donc 2 objects MyImageView ... un dans ma fenetre dont l'initWithCoder: est appelée et un autre caché je ne sais ou dont initWithFrame: est appelé....
    Donc si quelqu'un à  un lien à  me fournir pour approfondir cela merci
  • LeChatNoirLeChatNoir Membre, Modérateur
    01:29 modifié #9
    Slt,
    En fait, tu avais :
    * une instanciation de ta classe que tu as dû faire dans IB (classe-> instanciate)
    * une NSImageView que tu as glissée dans ta fenêtre et pour laquelle tu as indiqué ta classe comme "custom classe".

    Du coup, au chargement du .nib, il instancie 2 fois ta classe.

    On le voit bien dans le panel de IB en format liste.
    Par contre, ton histoire d'initWithCoder, je comprend pas... Tu as dû modifié ton code depuis ton 1er post car dans le source que j'ai, y a pas d'initWithCoder...

    a+



    [Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.