Подтвердить что ты не робот

UIImage imageNamed возвращает ноль

Я новичок в iOS и Xcode.

Я попытался загрузить изображение с помощью

[UIImage imageNamed:@"imageName.png/jpg and so on"];

но он возвращает только нуль. Изображение должно быть в моем пакете проектов, учитывая тот факт, что я могу выбрать его из меню перетаскивания в интерфейсе InterfaceBuilder, и он был добавлен в Xcode через меню "Добавить файлы в" имя проекта "...".

Не имеет значения, пользуюсь ли я изображениями .png или .jpg, результат остается тем же: они работают через IB, но не если я пытаюсь запустить метод imageNamed самостоятельно.

4b9b3361

Ответ 1

Есть только несколько причин, по которым изображение вернулось бы с помощью imageNamed:

  • Изображение не в вашей пачке. Убедитесь, что изображение на самом деле в вашем проекте. Убедитесь, что цель проверена, нажав на файл и выбрав цель, к которой он принадлежит.

  • У вас неправильно написано имя изображения или проблема с расширением.

  • Вы используете дисплей сетчатки, но у вас нет изображения @2x. Попробуйте сменить симулятор на сетчатку и посмотрите, появится ли он.

  • Если вы используете каталог ресурсов, убедитесь, что в инспекторе атрибутов выбраны правильные устройства.

Несколько советов:

Если вы тестируете с помощью симулятора, удалите приложение из симулятора и очистите проект, а затем снова запустите. Если он все еще отображается, он должен появиться на вашем телефоне (если это не так, вероятно, проблема с именем файла или версией @2x).

Если вы проводите тестирование на своем телефоне, и он не отображается, убедитесь, что вы используете ту же версию симулятора (если у вас iPhone 4/4, обязательно используйте симулятор 4/4 с сетчаткой).

И последнее, что следует из этого поста: изображение JPG не загружается с UIImage imageNamed. Существует некоторая проблема с некоторыми типами JPG, работающими с imageNamed и без расширения. IMO, вы все равно должны использовать PNG, поскольку iOS сжимает их для вас, если только вам не нужно использовать JPG.

Ответ 2

Re Майк Уэллер комментирует. Флажок установлен....

enter image description here

Ответ 3

В моем случае PNG был искажен.

По какой-то причине предварительный просмотр Xcode показал его правильно, но когда я попытался загрузить его с UIImage, он вернул нуль.

Ответ 4

У меня была эта проблема для jpg файлов, названных на диске "file.jpg"

Я пытался загрузить без расширения, просто @ "file". Хотя это отлично работает для png, это не для jpg. Когда я использовал @ "file.jpg", он сработает!

Ответ 5

Если вы подтвердили все вышеизложенное и обнаружили, что ваш UIImage (named: "myImage" ) возвращает nil из кода внутри динамической структуры, которую вы строите, тогда вам нужно изменить код в:

UIImage(named: "myImage", in: Bundle(identifier: "com.myframework.name"), compatibleWith: nil)

Это должно правильно извлекать актив из CXAssets.

Ответ 6

Попробуйте повторно экспортировать изображение.

У меня была аналогичная проблема, UIImage imageNamed возвращал нуль, и ни один из этих ответов не устранил мою проблему.

Я узнал, что это действительно что-то не так с файлом png. Я открыл файл в редакторе изображений GIMP, сохранил его как новый файл, экспортировал его снова как png и по волшебству начал работать.

Я вообще ничего не менял в коде, поэтому в фактическом файле изображения было что-то не так.

Ответ 7

У меня была та же проблема: @ "photo.jpg" приводила к 'nil' UIImage. Переходя к "фактическому" файлу, @ "photo.JPG" отлично работает! Я не понял, что там была чувствительность к регистру! ОЧЕНЬ неинтуитивный.

Ответ 8

У меня была аналогичная проблема, и, наконец, очистка зафиксировала ее: изображение появилось в симуляторе, но идентификатор не появился при запуске приложения на iPhone.
Что я сделал: 1) удалило приложение с iPhone 2) выполненный продукт/чистый после этого ошибка была исправлена, и изображение появилось!

Ответ 9

Попробуйте использовать UIImage(contentsOfFile:) вместо imageNamed. Он работал у меня с загруженными изображениями.

Ответ 10

Убедитесь, что в конце файла нет места. Имя типа name @2x.png не будет загружено, но [email protected] в порядке

Ответ 11

попробуйте

[UIImage imageNamed:@"imageName.png"];

вместо (с расширением)

Ответ 12

Работает ли изображение на симуляторе, но не на устройстве?

Если это так, в этом случае всегда работает с именем. Устройство требует точного случая, и симулятор не настолько суетлив, если я правильно помню.

например. для изображения с именем image.png

[UIImage imageNamed:@"Image"];

будет работать на симуляторе, но не на устройстве...

Ответ 13

Убедитесь, что у вас есть изображение для УСТРОЙСТВА, которое вы используете в файле .xcassets. Изображение, помеченное для iPad, не будет отображаться на телефоне (или имитированном телефоне).

Ответ 14

В дополнение к @Inturbidus ответ: Для тех, кто пришел сюда, работая над Расширениями приложений:

Образ, с которым вы работаете, должен принадлежать обеим целям - размещенному приложению и расширению.

В другом случае вы всегда будете получать nil, пытаясь получить к нему доступ из внутреннего кода.

Ответ 15

Для Xcode 6.4 нажмите на Images.xcassets и проверьте, есть ли записи для каждого вызванного вами изображения. Вы можете щелкнуть правой кнопкой мыши по изображению и выбрать "Показать в Finder", чтобы проверить, правильно ли добавлены изображения.

Ответ 16

Убедитесь, что поле имени инспектора атрибутов изображения совпадает с именем, которое вы используете. В моем случае изображение было частью папки, поэтому имя изображения было "папкой/именем". Использование этого длинного имени решило проблему. XCode 7.3.1

Ответ 17

В моем случае использование имени с акцентированными символами оказалось плохой идеей. Я сменил Astéroïdes на Asteroids, и он отлично работал.

Ответ 18

Swift 5

Если вы получаете UIImage nil в динамическом фреймворке, вы должны установить изображение с идентификатором пакета.

Вы можете создать расширение для Bundle следующим образом:

  • Создать расширение;

    extension Bundle { public static let myFramework = Bundle(identifier: "com.myFramework.bundle") }

  • Тогда используйте вот так;

    UIImage(named: "myImageName", in: Bundle.myFramework, compatibleWith: nil)

Или

Вы можете использовать как это;

  • UIImage(named: "myImageName", in: Bundle(for: type(of: self)), compatibleWith: nil)

Я думаю, что первый полезен, потому что он более читабелен, чем второй.

наслаждаться