UIImage imageNamed retourne nil
Je suis assez nouveau pour iOS et Xcode.
J'ai essayé de charger une image avec
[UIImage imageNamed:@"imageName.png/jpg and so on"];
mais il ne retourne nil. L'image doit être dans mon projet bundle, compte tenu du fait que je peux choisir de faire glisser et déposer des menus dans le InterfaceBuilder et il a été ajouté à Xcode via le bouton "Ajouter des fichiers "nomprojet"..." du menu contextuel.
Il ne fait aucune différence si j'utilise .png ou .les images jpg, le résultat reste le même: ils collaborer par l'intermédiaire de l'IB, mais pas si j'essaie de lancer le imageNamed méthode moi-même.
- Sélectionnez le fichier, puis ouvrez le Fichier Inspecteur volet sur la droite. Assurez-vous qu'une coche apparaît à côté de votre cible.
- Avez-vous essayé le nettoyage de votre projet? Maj-Pomme-K est la commande. cela semblait être la principale raison que j'ai perdu les images.
- essayé de nettoyer comme de ma première idée déjà. Ne pouvez pas trouver un coche dans l'Inspecteur de Fichiers, exactement où devrait-il être?
- ah, maintenant je sais ce que Mike Weller dire: oui, il y a une coche à côté de mon projet
- pouvez-vous modifier la question et de mettre dans le code exact que vous utilisez pour obtenir l'image s'il vous plaît?
- Il a travaillé pour moi une fois j'ai ajouté de l' .jpg dans le nom de l'image et fait en sorte d'avoir le @2x pour la rétine
- drôle, la case a été cochée sur l'initiale de la boîte de dialogue d'importation...
Vous devez vous connecter pour publier un commentaire.
Il n'y a que peu de raisons pour qu'une image puisse revenir nul avec imageNamed:
L'image n'est pas dans votre bundle. Assurez-vous que l'image est en fait dans votre projet. Assurez-vous que la cible est vérifié en cliquant sur le fichier et en sélectionnant la cible à laquelle il appartient.
Vous avez le nom de l'image mal orthographié ou un problème avec l'extension.
Vous utilisez un affichage de la rétine, mais n'ont pas un @2x image. Essayez de changer votre simulateur pour la rétine et de voir si il s'affiche.
Si vous utilisez un atout catalogue assurez-vous d'avoir le bon périphériques sélectionnés dans l'attribut de l'inspecteur.
Quelques conseils:
Si vous êtes un test à l'aide du simulateur de supprimer l'application de votre simulateur et le nettoyage de votre projet, puis de le ré-exécuter. Si elle apparaît toujours, il devrait s'afficher sur votre téléphone (si ce n'est pas c'est probablement un problème avec le cas du nom de fichier ou de l' @2x version).
Si vous testez sur votre téléphone et il n'apparaît pas, assurez-vous d'utiliser la même version du simulateur (si vous avez un iPhone 4/4s assurez-vous d'utiliser l'4/4s simulateur avec de la rétine).
Une dernière chose selon ce post: JPG image ne se charge pas avec UIImage imageNamed Il y a un problème avec certaines JPG types de travail avec imageNamed et sans extension. OMI, vous devriez être en utilisant des Png de toute façon depuis iOS compresse pour vous, sauf si vous avez juste à utiliser JPG.
.jpg
fichiers dans mon bundle pour comme... jamais? Copié l'une des fins de test, la perte de pro une demi-heure demandais pourquoi mon image n'était pas chargé. Jusqu'voter pour amener la.jpg
extension de problème, même si j'ai tout compris moi-même.#imageLiteral
dans Xcode 10.Re Mike Weller commentaire. La case à cocher est ....
Dans mon cas, le PNG a été mal formé.
Pour quelque raison Xcode aperçu affiché correctement, mais quand j'ai essayé de le charger avec UIImage, il est revenu nul.
J'ai juste eu ce problème pour les fichiers jpg nommé sur le disque "file.jpg"
J'ai essayé de charger sans l'extension, juste @"fichier". Alors que cela fonctionne très bien pour les png, ce n'est pas pour jpg. Une fois que j'ai utilisé @"file.jpg", il a travaillé!
Si vous avez vérifié tous les ci-dessus et de trouver que votre UIImage(nommé: "myImage") renvoie nil de code à l'intérieur d'un cadre dynamique, vous êtes la construction, alors vous devez changer le code pour:
Cela devrait récupérer l'actif de CXAssets correctement.
+(NSBundle*)currentBundle { static dispatch_once_t predicate = 0; static NSBundle *myBundle = nil; dispatch_once(&predicate, ^{ myBundle = [NSBundle bundleWithIdentifier:@"yourbundle.identifier"]; }); return myBundle; }
Swift 5
Si vous obtenez UIImage néant dans un cadre dynamique, vous devez définir l'image avec l'identifiant de lot.
Vous pouvez créer une extension pour les Bundle comme cela;
Créer extension;
extension Bundle {
public static let myFramework = Bundle(identifier: "com.myFramework.bundle")
}
Ensuite utiliser comme ceci;
UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)
Ou
Vous pouvez utiliser comme ceci;
UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)
Je pense que le premier est utile pour un code lisible.
Profiter de
J'ai eu le même problème: @"photo.jpg" entraîné " nil " UIImage.
En changeant le "réel" filespec, @"photo.JPG" fonctionne très bien!
Je n'avais pas réalisé qu'il y avait de la casse il y! TRÈS intuitif.
Essayez de ré-exporter votre image.
J'ai eu un problème similaire, UIImage imageNamed était de retour nul et aucune de ces réponses dans le corrigé mon problème.
J'ai trouvé que c'était en fait quelque chose de mal avec le fichier png. J'ai ouvert le fichier dans GIMP éditeur d'image, enregistrées dans un nouveau fichier, exporté à nouveau en tant que fichiers png et comme par magie il a commencé à travailler.
Je n'ai pas changer quoi que ce soit dans le code, donc il y avait certainement quelque chose de mal avec le fichier d'image.
j'ai eu un problème similaire, enfin le nettoyage fixe: l'image a montré dans le simulateur, mais l'id ne se présentent pas lors de l'exécution de l'application sur l'iPhone.
Ce que j'ai fait:
1) supprimé de l'app de l'iPhone
2) effectuées Produit/Nettoyer
après que le bug a été corrigé et l'image a montré jusqu'!
Essayez d'utiliser
UIImage(contentsOfFile:)
au lieu deimageNamed
. Il a travaillé pour moi avec des images téléchargées.Vérifiez que le fichier n'a pas d'espace à la fin.
Le nom comme
name @2x.png
échouera de chargement, mais[email protected]
est bienessayer
à la place (avec une extension)
L'image à travailler sur le simulateur, mais pas sur l'appareil?
Si donc, dans ce scénario, il est toujours à voir avec le cas de le nom. L'appareil nécessite des cas précis et le simulateur n'est pas si pointilleux si je me souviens bien.
par exemple, pour une image nommée image.png
serait de travailler sur le simulateur, mais pas sur l'appareil...
aa
,AA
,aA
, etAa
être le même fichier. Vous pouvez formater un nouveau HD avec HFS+ et décider de le rendre sensible à la casse (Utilitaire de Disque que vous donne le choix) mais les Mac livrés avec un pré-formaté HD qui n'est pas sensible à la casse. Mac de nombreux programmeurs ne font pas attention et puis leur application s'arrête sur Mac dont le propriétaire est re-formaté leur HD à être sensible à la casse; ce qui est possible si vous ré-installer votre système à partir de zéro.Assurez-vous d'avoir l'image pour l'APPAREIL que vous utilisez dans votre .xcassets fichier. Une image marquée pour l'iPad de ne pas s'afficher sur le téléphone (ou la simulation de téléphone).
En plus de @Inturbidus de réponse:
Pour ceux qui sont venus ici pour travailler sur Extensions de l'Application:
L'image que vous travaillez avec doit faire partie de les deux cibles hébergé application et d'extension.
Dans d'autres cas, vous allez toujours obtenir
nil
essaie d'y accéder à partir de l'intérieur de l'extension du code.Pour Xcode 6.4, cliquez sur les Images.xcassets et vérifier si il y a des entrées pour chaque image que vous avez appelé. Vous pouvez droit-cliquez sur l'image et sélectionnez "Afficher dans le Finder" pour vérifier si les images sont les bonnes ajouté.
Assurez-vous que les Attributs de l'Inspecteur de nom de domaine de l'image correspond exactement le nom que vous utilisez. Dans mon cas, l'image fait partie d'un dossier et si le nom de l'image a été "dossier/nom". L'utilisation de ce nom long résolu le problème. XCode 7.3.1
Dans mon cas, à l'aide d'un nom avec des caractères accentués s'est avéré être une mauvaise idée. J'ai changé Astéroïdes à des Astéroïdes et il a bien fonctionné.