TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Uzyskiwanie tego ostrzeżenia podczas pracy z TableViewController. Jak naprawić ten błąd i którego bloku dotyczy problem?
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000
Uzyskiwanie tego ostrzeżenia podczas pracy z TableViewController. Jak naprawić ten błąd i którego bloku dotyczy problem?
Odpowiedzi:
Ten pojawia się, gdy ktoś próbuje umieścić nil
w[UIImage imageNamed:]
Dodaj symboliczny punkt przerwania dla [UIImage imageNamed:]
Dodaj $arg3 == nil
warunek w symulatorze, $r0 == nil
warunek na 32-bitowym telefonie iPhone lub $x2 == nil
na 64-bitowym telefonie iPhone.
Uruchom aplikację i zobacz, gdzie zatrzyma się debugger.
PS Pamiętaj, że dzieje się tak również wtedy, gdy nazwa obrazu jest pustym ciągiem. Możesz to sprawdzić, dodając [(NSString*)$x2 length] == 0
do warunku.
UIImage imageNamed:
, ale mimo to zapisuję ten punkt przerwania.
$arg3
składni warunkowych punktów przerwania. Gdzie mogę dowiedzieć się więcej?
error: use of undeclared identifier '$arg3'
. Przegapiłem coś?
(int)[$arg3 length] == 0
Ten błąd (zwykle) występuje, gdy próbujesz załadować obraz, [UIImage imageNamed:myImage]
ale iOS nie jest pewien, czy myImage
to naprawdę jest, NSString
a wtedy masz to ostrzeżenie.
Możesz to naprawić za pomocą:
[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]
Lub możesz po prostu sprawdzić length
nazwę UIImage
:
if (myImage && [myImage length]) {
[UIImage imageNamed:myImage];
}
Ponieważ błąd polega na narzekaniu, że nadałeś imię (null)
, najprawdopodobniej jest to spowodowane dzwonieniem [UIImage imageNamed:nil]
. A dokładniej, przekazywanie zmiennej nie zostało ustawione, więc jest równe nil
. Chociaż użycie stringWithFormat:
pozbyłoby się błędu, myślę, że jest duża szansa, że nie robi tego, co chcesz. Jeśli nazwa, którą podasz jest nil
wartością, to użycie stringWithFormat: spowoduje, że będzie szukał obrazu, który jest dosłownie nazwany „(null)”, tak jakbyś wołał [UIImage imageNamed:@"(null)"]
.
Coś takiego jest prawdopodobnie lepszą opcją:
if (name) {
UIImage *image = [UIImage imageNamed:name];
} else {
// Do something else
}
Możesz chcieć ustawić punkt przerwania w Xcode w tej linii "Zrób coś innego", aby pomóc ci zrozumieć, dlaczego ten kod jest wywoływany z wartością zerową w pierwszej kolejności.
W Xcode 6.4 wydaje się, że ma to miejsce podczas używania „Wybranego obrazu” dla elementu paska kart w scenorysie, nawet jeśli jest to prawidłowy obraz.
W rzeczywistości i tak nie wydaje się, aby ustawiał wybrany obraz stanu, więc musi być zdefiniowany w atrybutach czasu wykonywania zdefiniowanych przez użytkownika i usunięty z atrybutu SelectedImage elementu paska kart
W moim przypadku przekazałem [UIImage imageNamed: @ ""], co spowodowało, że pokazałem ostrzeżenie. Po prostu dodaj punkty przerwania do wszystkich linii, w których użyłeś imageNamed i debuguj wiersz, w którym znajduje się ostrzeżenie.
[UIImage imageNamed:@""]
. Jak to naprawiłeś?
if
do sprawdzenia, czy nazwa obrazu nie jest pustym ciągiem lub przy użyciu domyślnego obrazu „noImage”, w jaki sposób można wyświetlić brak obrazu, gdy nie ma zastosowania żadna odpowiednia nazwa, a zasoby nie zawierają obrazu „noImage”?
Zdarzyło mi się to po podzieleniu storyboardu na kilka (faktyczna zmiana nastąpiła, gdy byłem na wakacjach, więc nie wiem dokładnie, jak to zostało zrobione).
Po sprawdzeniu kodu XML scenorysów stwierdziłem, że odwołanie do obrazu, które wcześniej wskazywało na „bottomBar” w katalogu zasobów, wskazywało zamiast tego imageView:fFo-1g-jzs:image
.
Na końcu pliku XML pod <resources>
tagiem został nazwany znacznik <image name="imageView:fFo-1g-jzs:image">
zawierający duży mutableData
blob.
Po zresetowaniu odniesienia do obrazu w scenorysie i usunięciu obiektu blob błąd zniknął.
Podajesz nieprawidłową nazwę obrazu, więc przed umieszczeniem jej musisz zweryfikować, możesz wykonać dowolny z powyższych sposobów, w zależności od tego, który ma sens dla twojego kodu lub podobnego
if (iconImageName && [iconImageName length])
{
[UIImage imageNamed:iconImageName];
}
else
{
iconImageName.hidden = YES;
}
Mam nadzieję, że to pomoże !!!!
Przyczyną błędu jest przekazanie wartości zerowej do metody „imageNamed:”. Aby tego uniknąć, możesz ukryć swój imageView, gdy próbujesz przekazać wartość nil. Szanse mogą wystąpić podczas ponownego użycia imageViews w UITableView lub mogą znajdować się w scrollViews.
Uniknąłem ostrzeżenia, sprawdzając poniżej:
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;
}
Jednym ze sposobów jest zamiana metod klasowych na [UIImage imageNamed:]
własną implementację, a następnie sprawdzenie nazwy obrazu w implementacji. Zobacz następujące:
Jak zamienić metodę klasową na iOS?
Zaimplementowałem to w mojej kategorii 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
}
Możesz też chcieć zawirować [UIImage imageNamed:inBundle:compatibleWithTraitCollection:]
.
Może możesz użyć tego, aby potwierdzić, że „nazwa_obrazu” nie jest „zerem”, a następnie pominiesz to ostrzeżenie.
if (imageName) {
self.imageView.image = [UIImage imageNamed:imageName];
}