TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Получение этого предупреждения при работе с TableViewController. Как исправить эту ошибку и какой блок затронут?
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Получение этого предупреждения при работе с TableViewController. Как исправить эту ошибку и какой блок затронут?
Ответы:
Это один появляется , когда кто - то пытается поставить nil
в[UIImage imageNamed:]
Добавить символическую точку останова для [UIImage imageNamed:]
Добавьте $arg3 == nil
условие в Simulator, $r0 == nil
условие на 32-битный iPhone или $x2 == nil
64-битный iPhone.
Запустите приложение и посмотрите, где остановится отладчик.
PS Имейте в виду, что это также происходит, если имя изображения - пустая строка. Вы можете проверить это, добавив [(NSString*)$x2 length] == 0
в условие.
UIImage imageNamed:
, но тем не менее я сохраняю эту точку останова.
$arg3
синтаксисе условных точек останова. Где я могу узнать больше?
error: use of undeclared identifier '$arg3'
. Я что-то пропустил?
(int)[$arg3 length] == 0
Эта ошибка (обычно) возникает, когда вы пытаетесь загрузить изображение, [UIImage imageNamed:myImage]
но iOS не уверена, myImage
действительно ли это, NSString
а затем появляется это предупреждение.
Вы можете исправить это, используя:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
Или вы можете просто проверить length
название UIImage
:
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
Поскольку ошибка связана с тем, что имя, которое вы дали (null)
, скорее всего вызвано вызовом [UIImage imageNamed:nil]
. Или, более конкретно, передача переменной не была установлена, поэтому она равна nil
. Хотя использование stringWithFormat:
позволит избавиться от ошибки, я думаю, что есть большая вероятность, что на самом деле он не делает то, что вы хотите. Если имя, которое вы вводите, является nil
значением, то использование stringWithFormat: приведет к поиску изображения с буквальным именем «(null)», как если бы вы вызывали [UIImage imageNamed:@"(null)"]
.
Что-то вроде этого, вероятно, лучший вариант:
if (name) {
UIImage *image = [UIImage imageNamed:name];
} else {
// Do something else
}
Возможно, вы захотите установить точку останова в Xcode в строке «Сделайте что-нибудь еще», чтобы помочь вам понять, почему этот код вызывается с нулевым значением.
В Xcode 6.4 это, похоже, происходит при использовании «Выбранное изображение» для элемента панели вкладок в раскадровке, даже если это действительное изображение.
На самом деле это, похоже, не устанавливает выбранное изображение состояния, поэтому его необходимо определить в пользовательских атрибутах времени выполнения и удалить из атрибута SelectedImage элемента панели вкладок.
В моем случае я передавал [UIImage imageNamed: @ ""], что заставило меня показать предупреждение. Просто добавьте точки останова ко всем строкам, в которых вы использовали imageNamed, и отладьте строку, в которой вы нашли предупреждение.
[UIImage imageNamed:@""]
. Как ты это починил?
if
чтобы проверить, не является ли имя изображения пустой строкой, или с использованием изображения по умолчанию «noImage», как вы не отображаете изображение, когда не применяется применимое имя, а активы не содержат изображение «noImage»?
Это случилось со мной после того, как раскадровка была разделена на несколько (фактическое изменение произошло, когда я был в отпуске, поэтому я точно не знаю, как это было сделано).
После проверки XML раскадровки я обнаружил, что ссылка на изображение, которая ранее указывала на «bottomBar» в каталоге ресурсов, вместо этого указывала на imageView:fFo-1g-jzs:image
.
В конце XML-файла под <resources>
тегом был тег с именем, <image name="imageView:fFo-1g-jzs:image">
содержащий большойmutableData
двоичный .
После сброса ссылки на изображение в раскадровке и удаления капли ошибка исчезла.
Вы указываете недопустимое имя изображения, поэтому перед его размещением необходимо проверить его, вы можете выполнить любой из вышеперечисленных способов, в зависимости от того, что имеет смысл для вашего кода или например
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
Надеюсь, это поможет !!!!
Причина ошибки - передача нулевого значения методу 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;
}
Один из подходов состоит в том, чтобы заменить метод класса [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:]
.
Возможно, вы можете использовать это, чтобы подтвердить, что «imageName» не является «nil»; тогда вы оставите это предупреждение.
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}