Image View qui fait planter mon appli

sisopetronsisopetron Membre
00:50 modifié dans API AppKit #1
Bonjour à  tous,

Voilà , mon premier post sur ce forum et je suis un peu honteux de demander votre aide pour un problème ridicule.  Donc pardonnez-moi pour mon ignorance, je débute en cocoa.

Mon appli est formée d'une fenêtre dans laquelle il n'y a encore rien (je vous disais que je suis super débutant).  Je veux y mettre une image juste pour la décoration.  Donc, dans IB, je glisse une Image View sur la fenêtre de mon appli et j'y dépose ensuite mon image.  Je compile et ça plante.  Déjà  !  :o

Ma question est donc toute bête : comment met-on une image sur le fond de la fenêtre d'une application ?  Qu'est-ce que j'ai déjà  fait de travers à  ce stade "avancé"  ;) de la conception de mon appli ?

Merci pour votre aide. 

tata !

Réponses

  • AliGatorAliGator Membre, Modérateur
    00:50 modifié #2
    Hello et Bienvenue :)

    Quand tu dis que ça plante, qu'est-il indiqué dans le débuguer et la console de ce dernier ? Parce que sans ce genre de détail on va avoir du mal à  cerner le problème !
  • GreensourceGreensource Membre
    00:50 modifié #3
    Bas là  comme ça je vois pas trop. Donc dans IB, tu as bien mis ton NSImageView par dessus la NSWindow? Tu dis avoir ajouter une image, tu l'as fait dans IB ou bien en codant?

    Tu pourrais mettre l'erreur renvoyer par Xcode ça aiderais.

    ps: Tu avais un vieux compte qui trainais on dirait, ça fait trois ans que tu es inscrit  :o
  • sisopetronsisopetron Membre
    00:50 modifié #4
    Merci pour vos réponses rapides : quelle réactivité !

    En fait, voilà  ce que dit le débugger :
    2009-07-23 11:51:23.615 anniversaires[74305:10b] An uncaught exception was raised<br />2009-07-23 11:51:23.617 anniversaires[74305:10b] *** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (IKImageView)<br />2009-07-23 11:51:23.618 anniversaires[74305:10b] *** Terminating app due to uncaught exception &#39;NSInvalidUnarchiveOperationException&#39;, reason: &#39;*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (IKImageView)&#39;
    


    L'image n'a manifestement pas d'importance : si je ne glisse aucune image sur mon image view, j'ai droit à  la même erreur de compilation.  Le simple fait de glisser une image view fait planter le truc.
  • NoNo Membre
    00:50 modifié #5
    Problème de SDK ou de version de OS X.
    - Quelle est ta version de Mac OS X ?
    - Ton projet utilise t'il le SDK correspondant à  ta version de OS X ?
  • 00:50 modifié #6
    Nan il a juste oublié d'importer Quartz.framework dans sa classe qui gère le Nib  :crackboom:- :)
  • GreensourceGreensource Membre
    00:50 modifié #7
    Bas dit donc faut le savoir ça! Il pourrait prévenir le bougre, j'aurais jamais trouvé non plus.
  • 00:50 modifié #8
    dans 1248350267:

    Bas dit donc faut le savoir ça! Il pourrait prévenir le bougre, j'aurais jamais trouvé non plus.


    Bha c'est assez simple à  savoir!
    <br />[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (IKImageView)<br />
    

    Direct tu vas chercher IKImageView dans la doc et tu regardes le framework nécessaire.. Quartz :D
  • GreensourceGreensource Membre
    00:50 modifié #9
    Ouais ça je suis d'accord c'est simple de savoir que ça concerne IKImageView. Par contre, "cannot decode object of class" ça ne me dit pas vraiment que j'ai oublié un framework.
  • 00:50 modifié #10
    Bha heu si c'est que au moment de charger l'interface il décode les objets du Nib, ça tout le monde le sait. Donc au moment où il passe sur le IKImageView il arrive pas à  le décoder car il trouve pas la classe. Classe qui est contenue dans Quartz.framework
  • GreensourceGreensource Membre
    00:50 modifié #11
    Maintenant j'ai compris mais je ne crois pas que si j'était tombé dessus j'aurais trouvé.
    Disons que j'aurrais préféré un "je n'ai pas pu parce que..." plutôt que juste un "j'arrive pas".
    J'imagine bien que ça c'est pas simple tout de faire remonter les bon message d'erreur, je veut juste dire qu'ils sont pas toujours super explicite pour mon cerveau.
  • 00:50 modifié #12
    dans 1248354099:

    Maintenant j'ai compris mais je ne crois pas que si j'était tombé dessus j'aurais trouvé.
    Disons que j'aurrais préféré un "je n'ai pas pu parce que..." plutôt que juste un "j'arrive pas".
    J'imagine bien que ça c'est pas simple tout de faire remonter les bon message d'erreur, je veut juste dire qu'ils sont pas toujours super explicite pour mon cerveau.

    Moi je suis sûr que t'aurais trouvé tout seul si t'avais vraiment fait face au problème. Surtout quand on voit que ça plante avant meme que le nib soit complètement chargé.
  • sisopetronsisopetron Membre
    00:50 modifié #13
    Bon, merci à  vous pour toutes ces explications.

    A titre indicatif, j'ai Mac OS 10.5.7 à  jour et j'ai téléchargé le dernier xcode (celui avec le sdk de iPhone 3.1) il y a quelques jours.

    Quand on crée une appli, il n'est pas censé charger tout ce qu'il faut ?  Ce truc, Quartz.framework, ne devrait pas être importé d'emblée dans mon nib ?

    Et comment je fais pour régler mon problème, moi ?  Si possible expliquez-moi ça clairement : je rappelle que je suis super, super-débutant. 

    Merci à  vous.
  • juillet 2009 modifié #14
    Mais y'a pas de problème  :o On est tous là  pour s'entre-aider :

    1- Tu vas chercher dans "/System/Library/Frameworks/" le fichier "Quartz.framework".
    2- Une fois trouvé, tu prends le fichier et tu le glisses dans ton projet, à  la partie "Frameworks" (voir l'image - c'est ds la sidebar, à  gauche de ton projet)
    3- Tu as forcément une classe qui gère ton Nib. un "AppController" par exemple. Tu ouvres "TaClasse.h" et juste avant "@interface TaClasse" tu rajoutes :

    #import <Quartz/Quartz.h>


    Tu compiles et execute et hop ça marche :)


    (J'ai rajouté un projet d'exemple)
  • yoannyoann Membre
    00:50 modifié #15
    Ce n'est pas fait automatiquement car nécessaire uniquement lorsque tu utilise des options Quartz

    Dans ton projet Xcode, dans l'arbre à  gauche tu déroule Target puis clic droit / get info sur ton application et en bas tu rajoute dans les Linked Libraries le framework Quartz.

    Edit: Il y a plusieurs méthode d'ajout de framework, ça reviens au même ^^
  • GreensourceGreensource Membre
    00:50 modifié #16
    Ah bas oui on avait oublié de dire comment ajouter un framework!
    Moi perso je fait autrement, je fait un clic droit sur le dossier frameworks
    add > existing framework...
    Et puis là  tu cherches ya Quartz.framework dans le coin.

    ps: C'est vrai que ça serait pas mal si IB l'ajoutais tout seul.

    [edit] ;) Si après ces trois explication tu n'y arrives pas
  • AliGatorAliGator Membre, Modérateur
    00:50 modifié #17
    Une question : y'a une grande différence entre IKImageView et NSImageView ? (Je ne me souviens pas avoir déjà  utilisé des IKImageView, je crois que c'est surtout l'équivalent de NSImageView mais en un peu plus avancé genre avec support de CoreImage et de l'édition ou je sais plus quoi ?)

    Parce que sinon, est-ce bien utile d'utiliser une IKImageView (et donc le framework ImageKit) plutôt qu'une bête NSImageView ? Une NSImageView (supportée de base car dans le AppKit.framework qui lui est inclus de base) n'est-elle pas suffisante ?
  • sisopetronsisopetron Membre
    00:50 modifié #18
    Merci à  vous pour l'explication pour l'adjonction de Quartz.framework ça marche !

    dans 1248364503:

    Parce que sinon, est-ce bien utile d'utiliser une IKImageView (et donc le framework ImageKit) plutôt qu'une bête NSImageView ? Une NSImageView (supportée de base car dans le AppKit.framework qui lui est inclus de base) n'est-elle pas suffisante ?


    Le problème c'est que je n'ai pas choisi : j'ai juste choisi l'image view dans les objets proposés par IB et posé le composant sur ma fiche.  C'est IB qui choisi IKImageView au lieu de NSImageView.  D'ailleurs, comment cela se fait-il ?  J'aimerais savoir ce que j'ai fait de travers.
  • AliGatorAliGator Membre, Modérateur
    00:50 modifié #19
    En effet quand tu cherches "Image" dans le panel "Library" d'InterfaceBuilder pour une appli Mac, tu ne trouves qu'une seule "ImageView", qui vient de la "Library - Image Kit" (c'est marqué au dessus), et est donc une IKImageView.

    Par contre si tu choisis le "Image Well" au dessus au lieu de "Image View", tu vois qu'en réalité ce qui est appellé "Image Well" dans la palette Library n'est rien d'autre qu'une NSImageView (sans doute un peu personnalisée, tu peux la re-rendre un peu plus standard en modifiant ses propriétés depuis l'inspecteur, par exemple en enlevant la bordure (choisir "None" dans le menu déroulant "Border" de l'Attributes Inspector).

    C'est vrai que j'avais jamais fait gaffe (ça fait un bail que j'ai pas programmé pour OSX maintenant que je me suis mis à  l'iPhone) mais c'est pas super intuitif... enfin bon.
  • sisopetronsisopetron Membre
    00:50 modifié #20
    Eh bien merci pour toutes ces explications.  je vais pouvoir continuer mon exploration de xcode. Je suppose que j'aurai encore à  faire appel à  votre aide.  :P

    Merci à  vous tous et bonne soirée.
  • GreensourceGreensource Membre
    00:50 modifié #21
    Exactement, je me suis dit la même chose Ali. Qu'est-ce qu'ils ont foutu de la NSImageVIew classique! Je crois bien me souvenir dans les anciens Xcode elle était là  pourtant.
    Vraiment étrange...
  • 00:50 modifié #22
    Nié? :D NSImageView est toujours là   ???
  • GreensourceGreensource Membre
    00:50 modifié #23
    Bas nan, comme le dit Ali, quand on fait une recherche dans la bibliothèque en tapant "NSImageView" tu n'as que ImageWell de proposé.
  • yoannyoann Membre
    00:50 modifié #24
    Pour ma part quand j'ai library de sélectionné dans le panel et que je recherche image j'ai tous les types qui montent
  • 00:50 modifié #25
    Ouaip d'abord! Nan mais oh.. NSImageView qui disparaà®t et puis quoi encore!
    Ali tu me déçois, arrête l'iPhone et remets-toi au Mac :D
  • AliGatorAliGator Membre, Modérateur
    juillet 2009 modifié #26
    Heu et vous arrêtez la bibine  :p et prenez du sommeil : ce que vous montrez sur les captures, c'est ce que j'ai dit ! ;D

    J'ai dit que si on cherche "Image" dans la palette Library, ce que l'on trouve est indiqué par les titres "Image Well" et "Image View", entre autres. Or le premier si on sais pas à  quoi ça correspond, on s'attend à  ce que ce soit un objet d'une hypothétique classe "NSImageWell" ou un truc comme ça... et surtout on vois en dessous un objet appellé "Image View" donc on pense que c'est ce que tout le monde appelle "une ImageView", et donc une NSImageView, alors que c'est une IKImageView, objet venant du framework ImageKit.

    J'ai aussi dit qu'en réalité l'ImageView était bien accessible par la palette Library, puisqu'il s'agissait de ce qui apparaà®t sous le label "Image Well"... et donc qu'il pouvait placer ce qui est indiqué comme un "ImageWell" dans IB et le customiser puisqu'en fait c'était bien un NSImageView.

    C'est juste pas naturel tel que ça apparaà®t dans la palette IB, mais c'est bien présent qd mm

    (nan mais ! :) )
  • 00:50 modifié #27
    Je sais pas j'ai pas lu ton post où tu parlais de ça en fait  :P C'est greensource qui dit que ça existe pu! nan mais oh!
    Greensource on va le frapper  :adios!:
    :-*
  • GreensourceGreensource Membre
    juillet 2009 modifié #28
    Nan mais c'est dingue ça! D'abord je suis plus fort que vous alors allez zy, viendez viendez!  >:)

    Et nan mais sérieusement chez moi j'ai pas tout ça! Ok j'ai bien aussi le ImageWell qui est un NSImageView, mais pas une NSImageView tout simple comme la UIImageView de l'iPhone.

    [edit] je rectifie, j'ai bien le même screenshot mais dedans le seul NSImageView c'est le ImageWell! Et donc si je suis un débutant et que je veux un NSImageView tout simple, bas c'est pas pratique!
  • yoannyoann Membre
    00:50 modifié #29
    :-°

    En tout cas le plus simple pour éviter de se tromper est tout simplement de bien sélectionner la section Cocoa dans la lib de IB, au moins pas de soucis :-p
  • AliGatorAliGator Membre, Modérateur
    00:50 modifié #30
    dans 1248419494:

    Et nan mais sérieusement chez moi j'ai pas tout ça! Ok j'ai bien aussi le ImageWell qui est un NSImageView, mais pas une NSImageView tout simple comme la UIImageView de l'iPhone.

    [edit] je rectifie, j'ai bien le même screenshot mais dedans le seul NSImageView c'est le ImageWell! Et donc si je suis un débutant et que je veux un NSImageView tout simple, bas c'est pas pratique!
    Bah oui c'est bien ce qu'on dit depuis le début.
    Quand tu cherches "Image" tu n'as que "Image View" et et "Image Well", la "Image View" est en fait une IKImageView, et la "Image Well" est la seule NSImageView.

    (attention, il n'y aura plus de rediffusion de ce programme sur vos chaà®nes, c'était la dernière :P)
Connectez-vous ou Inscrivez-vous pour répondre.