Ошибка: CUICatalog: Указано недопустимое имя актива: (null) или недопустимый коэффициент масштабирования: 2,000000


120
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000

Скриншот добавлен

Получение этого предупреждения при работе с TableViewController. Как исправить эту ошибку и какой блок затронут?


Вы можете разместить код?
Патрик Хофман

2
Это предупреждение также появляется, если имя изображения - пустая строка
onmyway133

Ответы:


242

Это один появляется , когда кто - то пытается поставить nilв[UIImage imageNamed:]

Добавить символическую точку останова для [UIImage imageNamed:]Пример символьной точки останова

Добавьте $arg3 == nilусловие в Simulator, $r0 == nilусловие на 32-битный iPhone или $x2 == nil64-битный iPhone.

Запустите приложение и посмотрите, где остановится отладчик.

PS Имейте в виду, что это также происходит, если имя изображения - пустая строка. Вы можете проверить это, добавив [(NSString*)$x2 length] == 0в условие.


7
Это умный подход. Похоже, мое нулевое изображение находится где-то в моем пике, поэтому оно не проходит UIImage imageNamed:, но тем не менее я сохраняю эту точку останова.
cbowns

9
Я не знал о $arg3синтаксисе условных точек останова. Где я могу узнать больше?
Зев Айзенберг

3
Не уверен, что понимаю, почему у меня это не работает, всегда возвращаюсь error: use of undeclared identifier '$arg3'. Я что-то пропустил?
Бен

5
Я продолжаю получать: Остановлен из-за ошибки оценки условия точки останова 23.1: "$ r0 == nil" Не удалось проанализировать условное выражение: ошибка: использование необъявленного идентификатора '$ r0' ошибка: 1 ошибка синтаксического анализа выражения
Pranoy C

8
В моем случае строка имени изображения была пустой, поэтому проверка длины arg3 у меня сработала. (int)[$arg3 length] == 0
Matthew Korporaal

62

Эта ошибка (обычно) возникает, когда вы пытаетесь загрузить изображение, [UIImage imageNamed:myImage]но iOS не уверена, myImageдействительно ли это, NSStringа затем появляется это предупреждение.

Вы можете исправить это, используя:

[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]

Или вы можете просто проверить lengthназвание UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
В случае, если кто-то совершил ту же ошибку, что и я, я пытался обновить фоновое изображение UIButton, которое нужно удалить (без изображения вообще), и поэтому я изменил свое имя UIImage со строки на просто "", что вызвало ошибку. Удалив весь UIImage (названный: "") и заменив его на nil, ошибка исчезла.
Dave G

@DaveG Вы, сэр, сэкономили мне часы. Спасибо за комментарий!
Джефф

22

Поскольку ошибка связана с тем, что имя, которое вы дали (null), скорее всего вызвано вызовом [UIImage imageNamed:nil]. Или, более конкретно, передача переменной не была установлена, поэтому она равна nil. Хотя использование stringWithFormat:позволит избавиться от ошибки, я думаю, что есть большая вероятность, что на самом деле он не делает то, что вы хотите. Если имя, которое вы вводите, является nilзначением, то использование stringWithFormat: приведет к поиску изображения с буквальным именем «(null)», как если бы вы вызывали [UIImage imageNamed:@"(null)"].

Что-то вроде этого, вероятно, лучший вариант:

if (name) {
    UIImage *image = [UIImage imageNamed:name];
} else {
    // Do something else
}

Возможно, вы захотите установить точку останова в Xcode в строке «Сделайте что-нибудь еще», чтобы помочь вам понять, почему этот код вызывается с нулевым значением.


1
У меня та же проблема, и ошибка заключалась в том, что имя изображения было нулевым, как говорит robotspacer.
diegomen

17

В Xcode 6.4 это, похоже, происходит при использовании «Выбранное изображение» для элемента панели вкладок в раскадровке, даже если это действительное изображение.

введите описание изображения здесь

На самом деле это, похоже, не устанавливает выбранное изображение состояния, поэтому его необходимо определить в пользовательских атрибутах времени выполнения и удалить из атрибута SelectedImage элемента панели вкладок.

введите описание изображения здесь


1
Спасибо вам за это! Эти сообщения об ошибках / предупреждениях сводили меня с ума! Я не могу понять, почему Apple не избавляется от раскрывающегося списка «Выбранное изображение» элемента панели вкладок в IB или не исправляет его, чтобы он работал правильно.
wcochran 01

4

В моем случае я передавал [UIImage imageNamed: @ ""], что заставило меня показать предупреждение. Просто добавьте точки останова ко всем строкам, в которых вы использовали imageNamed, и отладьте строку, в которой вы нашли предупреждение.


Я тоже использую [UIImage imageNamed:@""]. Как ты это починил?
Julfikar

[aButton setImage: nil forState: UIControlStateNormal]
Ганеман

Помимо использования, ifчтобы проверить, не является ли имя изображения пустой строкой, или с использованием изображения по умолчанию «noImage», как вы не отображаете изображение, когда не применяется применимое имя, а активы не содержат изображение «noImage»?
ушел

2

Это случилось со мной после того, как раскадровка была разделена на несколько (фактическое изменение произошло, когда я был в отпуске, поэтому я точно не знаю, как это было сделано).

После проверки XML раскадровки я обнаружил, что ссылка на изображение, которая ранее указывала на «bottomBar» в каталоге ресурсов, вместо этого указывала на imageView:fFo-1g-jzs:image .

В конце XML-файла под <resources>тегом был тег с именем, <image name="imageView:fFo-1g-jzs:image">содержащий большойmutableData двоичный .

После сброса ссылки на изображение в раскадровке и удаления капли ошибка исчезла.


Это решило эту проблему для меня, я искал эту проблему некоторое время, это сводило меня с ума. Фишка точки останова у меня не сработала.
Моше Готтлиб

Здесь та же проблема, но точка останова помогла мне найти xib, в которой он был. Имя образа было Неизвестное изображение в IB.
Джош Бернфельд

1

Я только что исправил эту ошибку. Просто проверьте использование [UIImage imageNamed:(NSString*) imageName]функции. Если imageNameесть nil, то возникает ошибка.


1

Вы указываете недопустимое имя изображения, поэтому перед его размещением необходимо проверить его, вы можете выполнить любой из вышеперечисленных способов, в зависимости от того, что имеет смысл для вашего кода или например

if (iconImageName && [iconImageName length])
{

    [UIImage imageNamed:iconImageName];
}
else
{
     iconImageName.hidden = YES;
}

Надеюсь, это поможет !!!!


0

Причина ошибки - передача нулевого значения методу imageNamed :. Чтобы избежать этого, вы можете скрыть свой imageView, когда пытаетесь передать значение nil. Вероятность может возникнуть при повторном использовании imageViews в UITableView или может быть в scrollViews.

Я избежал предупреждения с помощью следующей проверки:

UIImageView *your_image_view;
NSString *imageName;
if(imageName && imageName.length){
 your_image_view.hidden = NO;
 your_image_view.image = [UIImage imageNamed:imageName];
}
else {
 your_image_view.hidden = YES;
}

0

Я получил это предупреждение, когда я загружаю использование изображения [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal], чем, я меняю на [UIImage imageNamed:normalStr], предупреждение исчезло.


0

Один из подходов состоит в том, чтобы заменить метод класса [UIImage imageNamed:]собственной реализацией, а затем проверить имя изображения в своей реализации. См. Следующее:

Как изменить метод класса на iOS?

Я реализовал это в моей категории UIImage (Debug):

+ (UIImage *)db_imageNamed:(NSString *)imageName {
    if ([imageName length] == 0) {
        NSLog(@"breakpoint here");
    }
    return [self db_imageNamed:imageName];  // not a recursive call here after swizzling
}

Возможно, вы также захотите выпить [UIImage imageNamed:inBundle:compatibleWithTraitCollection:].


-1

Возможно, вы можете использовать это, чтобы подтвердить, что «imageName» не является «nil»; тогда вы оставите это предупреждение.

 if (imageName) {
    self.imageView.image = [UIImage imageNamed:imageName];
 }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.