framework : image dans le bundle introvable

blaiseblaise Membre
01:42 modifié dans Apple Developer Programs #1
Bonjour

J'ai besoin de créer un framework de mon projet. Ce projet contient une UIView optimisée et des images à  afficher.
Pour construire mon framework, j'ai créer une nouvelle target "bundle" dont j'ai redéfinit l'extension en 'framework' ; j'ai ensuite ajouter mes .h et .m dans 'Copy Headers' et 'Compile Sources' ; J'ai ajouter mes images dans 'Copy Bundle Resources'.
(j'ai suivi le tuto suivant : http://db-in.com/blog/2011/05/creating-universal-framework-to-iphone-ios/)

J'importe mon framework dans mon nouveau projet et je l'utilise dans problème. Ma vue optimisée s'affiche et fais ce que je lui demande ;

Par contre impossible d'affiché les images .... !

J'ai tout essayé, et mes image sont introuvable :
<br />NSLog(@&quot;test bundle : %@&quot;, [[NSBundle mainBundle]pathForResource:@&quot;FLECHE-BAS&quot; ofType:@&quot;png&quot;]);<br />	<br />	UIImage* comeBackImage = [UIImage imageNamed:@&quot;FLECHE-BAS.png&quot;];<br />	NSLog(@&quot;test image : %@&quot;, [comeBackImage description]);<br />


Ces deux log me retourne nil !

Auriez vous des idées ?
Merci
Blaise

Réponses

  • LexxisLexxis Membre
    juin 2011 modifié #2
    Bonjour,
    as tu essayé avec la méthode bundleForClass: ? Cette méthode te retourne le bundle pour la classe passé en paramètre (surement [self class] pour ton cas). Le mainbundle correspond au bundle de l'application qui s'exécute.
  • blaiseblaise Membre
    01:42 modifié #3
    Helas...

    J'ai essayé, et ça marche pas mieux... Je me demande si les images d'un framework sont bien prise en compte dans le Bundle quand j'exécute l'application.

    <br />NSLog(@&quot;Class bundle : %@&quot;, [[NSBundle bundleForClass:[self class]]bundlePath]);<br />NSLog(@&quot;test bf bundle : %@&quot;, [[NSBundle bundleForClass:[self class]]pathForResource:@&quot;FLECHE-BAS&quot; ofType:@&quot;png&quot;]);<br />
    



    Class bundle : /var/mobile/Applications/70EE9EAC-87D2-4C0C-8955-C3D0BE13AEAC/MonAppli.app
    test bf bundle : (null)
  • DrakenDraken Membre
    01:42 modifié #4
    Je n'ai pas de réponse à  ton problème. Par contre je suis curieux de savoir ce que tu appelles une UIView optimisée. Une vue EAGL affichant un context OpenGL ?

  • blaiseblaise Membre
    01:42 modifié #5
    dans 1307710484:

    Je suis curieux de savoir ce que tu appelles une UIView optimisée. Une vue EAGL affichant un context OpenGL ?


    Une class qui extend UIView et qui redéfinit son comportement à  l'affichage. Rien que du très normal.

    Et sinon, pas la moindre idée, je suis complétement bloqué !
  • blaiseblaise Membre
    01:42 modifié #6


    Si j'élargis la question : comment importé des images (ou autre ressources) dans un framework pour qu'elles soient utilisable par les classes de ce framework ?
  • CéroceCéroce Membre, Modérateur
    juin 2011 modifié #7
    Lexxis t'a donné la réponse.

    Une framework est un bundle. Pour accéder aux ressources, il faut demander au bon bundle.
    +[NSBundle mainBundle] renvoie le bundle qui fait appel aux autres bundles. En général, il s'agit donc de l'application.

    Si tu veux accéder au bundle de la framework, tu utiliseras donc une autre méthode comme +bundleWithIdentifier: , +bundleForClass: ou +bundleWithPath:


    Par contre, j'étais resté sur l'idée qu'on n'avait pas le droit d'utiliser des frameworks de tierce partie dans les applis iOS. D'ailleurs, je ne comprends pas bien ton intérêt à  faire une framework.
  • LexxisLexxis Membre
    01:42 modifié #8
    dans 1307709187:

    Helas...

    J'ai essayé, et ça marche pas mieux... Je me demande si les images d'un framework sont bien prise en compte dans le Bundle quand j'exécute l'application.

    <br />NSLog(@&quot;Class bundle : %@&quot;, [[NSBundle bundleForClass:[self class]]bundlePath]);<br />NSLog(@&quot;test bf bundle : %@&quot;, [[NSBundle bundleForClass:[self class]]pathForResource:@&quot;FLECHE-BAS&quot; ofType:@&quot;png&quot;]);<br />
    



    Class bundle : /var/mobile/Applications/70EE9EAC-87D2-4C0C-8955-C3D0BE13AEAC/MonAppli.app
    test bf bundle : (null)



    Quelle classe représente self dans tes deux NSLogs ?
  • AliGatorAliGator Membre, Modérateur
    01:42 modifié #9
    Plus haut tu utilises bien bundleForClass mais tu lui passes [self class], où self est sans doute pas la PrincipalClass de ton bundle de ton framework ! Du coup forcément il ne te retourne pas le bundle attendu, on le voit bien avec ton log de son bundlePath, tu vois qu'il te retourne le bundle correspondant à  l'appli et pas au framework. Utilise plutôt bundleWithIdentifier par exemple.

    @Ceroce : ce qui est interdit sur iOS, c'est d'utiliser des bibliothèques dynamiques. Tu peux linker à  ton projet des librairies statiques (encore heureux). Après, le fait d'organiser ta librairie statique dans un dossier contenant aussi un dossier "Headers" avec tes .h publics, et de donner à  ce dossier l'extension ".framework", rien ne te l'interdit. (Du moins perso j'ai jamais testé mais au dernier CocoaHeads rennais c'est justement ce qu'il faisait pour ses projets, et je comptais bien réorganiser mes fichiers pour faire pareil de mon côté)
    Du moment que ton bundle "machin.framework" que tu t'es fait contient du code linké uniquement en statique, au final lui ça lui change rien.

    D'ailleurs, c'est précisément expliqué dans l'article cité plus haut (http://db-in.com/blog/2011/05/creating-universal-framework-to-iphone-ios/, très bon article que je ne connaissais pas et vais m'empresser de mettre de côté), je t'invite à  lire au moins le premier paragraphe ("Framework on iOS? Really?").
  • blaiseblaise Membre
    juin 2011 modifié #10
    [self class] retourne bien la class utilise dans le framework (mon OptimizedView) ; quand je fais un bandleFromClass dessus, il me retourne le bundle de l'application et non le bundle du framework...

    Pour bundleWithIdentifier, j'avoue ne pas savoir comment l'utilisé : il est dit que l'on doit lui passer un identifier, mais je n'ai aucune idée de la valeurs de celui-ci ; est-ce le nom du Framework ?
    (Va falloir que je me renseigne un peu plus sur l'utilisation des Bundle).

    EDIT : aprés renseignement, il faut passer l'identifier du framework ; mais étant donné que celui-ci n'a pas de fichier MonFramework-info.plist (ou autre nom) spécifiant le bundle identifier, qu'elle identifier lui passer ?

    EDIT 2 : j'ai ajouté le info-plist avec un bundleIdentifier, j'ai modifier les setting du framework pour prendre en compte cette info.plist, mais pas d'amélioration, bundleWithIdentifier me retourne nil (alors que quand je lance l'appli hors framework, il me retourne le bon bundle...)
  • CéroceCéroce Membre, Modérateur
    01:42 modifié #11
    Merci de l'info, je pensais que les frameworks contenaient forcément des bibliothèques dynamiques.
  • AliGatorAliGator Membre, Modérateur
    01:42 modifié #12
    Moi aussi jusqu'à  il y a quelques semaines :P
Connectez-vous ou Inscrivez-vous pour répondre.