Błąd: CUICatalog: podano nieprawidłową nazwę zasobu: (null) lub nieprawidłowy współczynnik skalowania: 2,000000


120
TableViewApplication[1458:70b] CUICatalog: Invalid asset name supplied: (null), or invalid scale factor: 2.000000

Dodano zrzut ekranu

Uzyskiwanie tego ostrzeżenia podczas pracy z TableViewController. Jak naprawić ten błąd i którego bloku dotyczy problem?


Czy możesz wysłać kod?
Patrick Hofman

2
To ostrzeżenie pojawia się również, jeśli nazwa obrazu jest pustym ciągiem
onmyway133

Odpowiedzi:


242

Ten pojawia się, gdy ktoś próbuje umieścić nilw[UIImage imageNamed:]

Dodaj symboliczny punkt przerwania dla [UIImage imageNamed:]Przykład symbolicznego punktu przerwania

Dodaj $arg3 == nilwarunek w symulatorze, $r0 == nilwarunek na 32-bitowym telefonie iPhone lub $x2 == nilna 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] == 0do warunku.


7
To sprytne podejście. Wygląda na to, że mój zerowy obraz jest gdzieś w mojej stalówce, więc nie przechodzi UIImage imageNamed:, ale mimo to zapisuję ten punkt przerwania.
cbowns

9
Nie wiedziałem o $arg3składni warunkowych punktów przerwania. Gdzie mogę dowiedzieć się więcej?
Zev Eisenberg

3
Nie jestem pewien, czy rozumiem, dlaczego to nie działa dla mnie, zawsze wraca error: use of undeclared identifier '$arg3'. Przegapiłem coś?
Ben

5
Wciąż otrzymuję: Zatrzymano z powodu błędu podczas oceny warunku punktu przerwania 23.1: „$ r0 == nil” Nie można przeanalizować wyrażenia warunkowego: błąd: użycie niezadeklarowanego identyfikatora „$ r0” błąd: 1 błędy podczas analizowania wyrażenia
Pranoy C

8
W moim przypadku ciąg z nazwą obrazu był pusty, więc sprawdzanie długości arg3 zadziałało. (int)[$arg3 length] == 0
Matthew Korporaal

62

Ten błąd (zwykle) występuje, gdy próbujesz załadować obraz, [UIImage imageNamed:myImage]ale iOS nie jest pewien, czy myImageto naprawdę jest, NSStringa wtedy masz to ostrzeżenie.

Możesz to naprawić za pomocą:

[UIImage imageNamed:[NSString stringWithFormat:@"%@", myImage]]

Lub możesz po prostu sprawdzić lengthnazwę UIImage:

if (myImage && [myImage length]) {

    [UIImage imageNamed:myImage];
}

1
Na wypadek, gdyby ktoś popełnił ten sam błąd, co ja, próbowałem zaktualizować obraz tła UIButton do usunięcia (brak obrazu), więc zmieniłem nazwę UIImage z ciągu na „”, co spowodowało błąd. Po usunięciu całego UIImage (o nazwie: „”) i zastąpieniu go nil, błąd zniknął.
Dave G

@DaveG Panie, zaoszczędził mi wiele godzin. Dziękuje za komentarz!
Jeff

22

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 nilwartoś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.


1
Mam ten sam problem i błąd polegał na tym, że nazwa obrazu była zerowa, jak mówi robotspacer.
diegomen

17

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.

wprowadź opis obrazu tutaj

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

wprowadź opis obrazu tutaj


1
Dziękuję za to! Te komunikaty o błędach / ostrzeżenia doprowadzały mnie do szału! Nie mogę zrozumieć, dlaczego Apple nie pozbywa się rozwijanego elementu paska zakładek „Wybrany obraz” w IB lub nie naprawia go, aby działał poprawnie.
wcochran

4

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.


Ja też używam [UIImage imageNamed:@""]. Jak to naprawiłeś?
Julfikar

[aButton setImage: nil forState: UIControlStateNormal]
Hahnemann

Inaczej niż przy użyciu znaku ifdo 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”?
odszedł

2

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 mutableDatablob.

Po zresetowaniu odniesienia do obrazu w scenorysie i usunięciu obiektu blob błąd zniknął.


To rozwiązało to dla mnie, szukałem tego problemu od jakiegoś czasu, doprowadzało mnie do szału. Punkt przerwania nie działał dla mnie.
Moshe Gottlieb

Ten sam problem, ale punkt przerwania pomógł mi znaleźć xib, w którym się znajdował. Nazwa obrazu brzmiała Unknown Image w IB.
Josh Bernfeld

1

Właśnie naprawiłem ten błąd. Po prostu sprawdź użycie [UIImage imageNamed:(NSString*) imageName]funkcji. Jeśli imageNametak nil, wystąpi błąd.


1

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 !!!!


0

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

0

Otrzymałem to ostrzeżenie, kiedy wczytuję użycie obrazu [[UIImage imageNamed:normalStr] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal], potem , zmieniam na [UIImage imageNamed:normalStr], ostrzeżenie zniknęło.


0

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:].


-1

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];
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.