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];
}