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
крапку.
Після скидання посилання на зображення на аркуші та вилучення крапки помилка усунулася.
Я щойно виправив цю помилку. Просто перевірте використання [UIImage imageNamed:(NSString*) imageName]
функції. Якщо imageName
це так nil
, то виникає помилка.
Ви вводите недійсне ім’я зображення, тому перед його введенням потрібно перевірити його, ви можете зробити будь-який із перерахованих вище способів, залежно від того, який сенс має ваш код чи подібні
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
Сподіваюся, це допоможе !!!!
Причина помилки передає нульове значення методу "imageNamed:". Щоб уникнути цього, ви можете приховати imageView, коли намагаєтесь передати нульове значення. Ці шанси можуть виникнути при повторному використанні 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 (налагодження):
+ (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" не є "нульовим"; тоді ви залишите це попередження.
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}