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
на устройстве iPhone
Запустите приложение и посмотрите, где проблема сохраняется.
ПРИБЫЛЬ
Эта ошибка (обычно) возникает, когда вы пытаетесь загрузить изображение с помощью [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 это происходит при использовании "Selected Image" для элемента панели вкладок в раскадровке, даже если это допустимое изображение.
На самом деле это не похоже на выбранное изображение состояния в любом случае, поэтому его необходимо определить в пользовательских атрибутах времени выполнения и удалить из атрибута SelectedImage элемента панели вкладок
В моем случае я проходил мимо [UIImage imageNamed: @""], что заставило меня показать предупреждение. Просто добавьте точки останова во все строки, где вы использовали imageNamed, и отлаживаете строку, в которой вы найдете предупреждение.
Я только что исправил эту ошибку. Просто проверьте использование функции [UIImage imageNamed:(NSString*) imageName]
. Если imageName
- nil
, тогда возникает ошибка.
Причиной ошибки является передача значения nil методу 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:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]
, чем, я перехожу на [UIImage imageNamed:normalStr]
, предупреждение не прошло.
Один из подходов - это метод класса swizzling, чтобы заменить [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
}
Возможно, вы захотите также swizzle [UIImage imageNamed:inBundle:compatibleWithTraitCollection:]
.
Вы поставляете какое-то недопустимое имя изображения, поэтому перед его установкой нужно проверить, что вы можете использовать любой из вышеперечисленных способов, какой смысл имеет смысл для вашего кода или как
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
Надеюсь, это поможет!!!!
Может быть, вы можете использовать это, чтобы подтвердить, что "imageName" не является "нолем", а затем вы оставите это предупреждение.
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}