2013-04-07 20 views
9
[UIImage imageNamed:filename] 

Ta metoda zwraca wartość null tylko na urządzeniu.iOS - UIImage imageNamed: zwraca null na urządzeniu

Wiem, że jest to znany problem i zwykle wynika to z faktu, że symulator nie rozróżnia wielkości liter. Wypróbowałem proponowane tutaj rozwiązania: UIImage imageNamed returns nil

Ale nic nie działało dla mnie.

Sprawa jest prosta: mam 4 pliki o nazwach: [email protected]~ipad.png, [email protected]~iphone.png, Bar ~ ipad.png, Bar ~ iphone.png. Wszystkie są zaznaczone w polu wyboru z celem docelowym.

NSLog(@"%@",[UIImage imageNamed:@"Bar"]); 

To wiersz kodu daje mi null dla urządzenia, a ja naprawdę nie mam pojęcia co robię źle teraz.

Odpowiedz

5

Ostatnio miałem taki problem.

Po odtworzeniu nazw plików i ścieżek czasami pomaga to podczas czyszczenia i odbudowywania projektu.

+0

Miałem takie problemy również w przeszłości, więc mogłoby to pomóc ... –

+0

Jestem pewien, że zrobiłem to kilka razy wcześniej. Teraz zadziałało. Dzięki. – Gricha

+0

Sprawdź: 'XCode - Fazy kompilacji - Kopiuj zasoby pakietu - {patrz obraz jest dostępny lub nie jest dostępny} add & run'. – Vicky

4

Ostatnio znalazłem się w tej samej sytuacji.

Rozwiązaniem w moim przypadku było dodanie rozszerzenia do nazwy pliku.

[UIImage imageNamed:@"Bar.png"] 
+0

Dziękuję. Właśnie tego spróbowałem i niestety to nie pomogło w moim przypadku. – Gricha

+0

w przypadku png, które nie powinno mieć znaczenia. Być może natknąłeś się na inny format pliku –

+2

Nie było to png, a zdanie nie wydaje się bardzo odpowiednie. –

1

całkowicie czysta Twój build i przerobić go:

  1. usunąć aplikację z urządzenia
  2. opcja czyszczenia cały katalog budować w Xcode (⌘-Shift-K)
  3. rzucić Xcode
  4. usunięcie ~/Library/Developer/Xcode/DerivedData
  5. restart Xcode, zbudować i uruchomić
0

Napotkałem ten problem i po prostu go naprawiłem. Poniżej wymieniono rozwiązanie jako odniesienie.

Mam kilka obrazów i użyć [UIImage imageNamed: filePath], aby je wyświetlić. Wszystkie obrazy wyświetlają się dobrze oprócz 1 na symulatorze/urządzeniu, ale wszystkie z nich można zobaczyć na OS X. Dla tego obrazu [UIImage imageNamed] zawsze zwraca wartość null.

Po kilku minutach dochodzenia odkryłem, że przyczyną problemu z obrazem jest duży rozmiar pliku: 4,1 mln. Pozostałe wynoszą około 800 KB. Mają prawie taki sam rozmiar w wymiarze.

Następnie próbuję otworzyć go w edytorze obrazów, a następnie ponownie go zapisać. Następnie wielkość spadła do 800 tys. problem rozwiązany.

Powody Chyba,

  1. [UIImage imageNamed: filePath] ma max limit rozmiaru pliku? (mała możliwość, ale trzeba sprawdzić oficjalny dokument)

  2. sam obraz ma pewien błąd. Ale OS X ma lepszą tolerancję niż iOS. więc iOS nie może odczytać i zwrócić wartości null.Ten problem jest taki, że OS X może odtwarzać więcej typów plików wideo niż iOS, ponieważ obsługuje więcej kodeków.

Jeśli więc napotkasz ten problem w przyszłości, poświęć kilka sekund na sprawdzenie rozmiaru pliku. Nadzieja, pomoc.

1

To właśnie przydarzyło się mnie, i odkryć było bardzo trudne: Miałem jeden obraz, który gdzie zero tylko na urządzeniu

logoWhite.png 

mój kod:

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"LogoWhite"] forBarMetrics:UIBarMetricsDefault]; 

Po pewnym czasie debugowania, Zauważyłem, że nazwa obrazu zaczyna się od dużej litery. Oczywiście nie ma to znaczenia w systemie OSX z systemem plików case ignorowania. System plików iOs nie jest, więc obraz działał na symulatorze, ale nie na urządzeniu.

Założę się, że wszystkie rozwiązania dotyczące czyszczenia uzyskanych danych i ich odbudowania zakończyły się losowo wraz ze zmianą nazwy obrazu, co też mogłoby się przydać. Po prostu publikuj tutaj dla przyszłego odniesienia :)

+0

OP rzeczywiście wspomniał, że sprawdził przypadek nazwy pliku, ponieważ (symulator = wielkość liter w odróżnieniu od urządzenia = wielkość liter) jest dobrze znanym problemem. W związku z tym nie była to nazwa pliku. – siburb

0

To jest dziwny problem, którego nie widziałem aż do tego tygodnia.

Poniżej znajdują się moje ustalenia i obejście problemu.

W mojej aplikacji na iPhone'a pobieram obraz i zapisuję go lokalnie, a to zawsze działało dobrze.

Ale teraz, gdy uruchomiłem ten sam kod, nagle nie udało się utworzyć z niego UIImage za pomocą funkcji imageNamed, a teraz zwracał zero.

Trzy notatki choć:

  1. Ten dokładny kod nie działa wcześniej, przy użyciu tego samego kodu źródłowego i .png plików graficznych. Nie jestem pewien, czy moja kopia XCode 6.x lub iOS 8.x po cichu aktualizowała się w międzyczasie.
  2. Kod kontynuuje, aby działał poprawnie (z tym samym plikiem graficznym) na symulatorze iPhone'a. To po prostu nie działa na prawdziwym urządzeniu.
  3. Proszę spojrzeć na kod poniżej. Gdy nie powiodło się UIImage:imageNamed, uruchomiłem kod, aby sprawdzić, czy plik faktycznie istnieje ... i tak się stało. Następnie załadowałem dane binarne z pliku przy użyciu NSData:contentsAtPath (co również udowodniło, że plik istnieje i znajdował się we właściwym folderze), a następnie utworzyło z tego UIImage i działało dobrze.

Huh?!

UIImage* img = [UIImage imageNamed:backgroundImageFilename]; 
if (img != nil) 
{ 
    // The image loaded fine (this always worked before). Job done. 
    // We'll set our UIImageView "imgBackgroundView" to contain this image. 
    self.imgBackgroundView.image = img; 
} 
else 
{ 
    // We were unable to load the image file for some reason. 
    // Let's investigate why. 

    // First, I checked whether the image was actually on the device, and this returned TRUE... 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:backgroundImageFilename]; 
    if (fileExists) 
     NSLog(@"Image file does exist."); 
    else 
     NSLog(@"Image file does not exist."); 


    // Next, I attempted to just load the bytes in the file, and amazingly, this also worked fine... 
    NSData *data = [[NSFileManager defaultManager] contentsAtPath:backgroundImageFilename]; 
    if (data != nil) 
    { 
     // ..and then I COULD actually create a UIImage out of it. 
     img = [UIImage imageWithData:data]; 
     if (img != nil) 
     { 
      // We have managed to load the .png file, and can now 
      // set our UIImageView "imgBackgroundView" to contain this image. 
      self.imgBackgroundView.image = img; 
     } 
    } 
} 

Jak już powiedziałem, ten kod zapewnia obejście tego problemu, ale to bardzo dziwne, że nagle zaczęło się dziać.

I, powinienem powiedzieć, wypróbowałem inne sugestie w tym wątku, oczyściłem projekt, usunąłem DerivedData, całkowicie usunąłem aplikację z urządzenia itd., Ale nie zrobiły żadnej różnicy.

Byłbym zainteresowany wiedząc, czy ktoś inny trafi ten problem, i stwierdza, że ​​mój przykładowy kod działa dla nich.

Aktualizacja

jestem idiotą.

Nie jestem pewien, czy funkcja UIImage:imageNamed uległa zmianie lub coś (a jeśli tak, to dlaczego nadal działa dobrze na iPhone 8.1 symulator), ale znalazłem następujące jedna linia robi praca w porządku:

UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename]; 

Wygląda na to, że należy użyć tej funkcji do ładowania obrazów, które nie są częścią pakietu aplikacji.

0

Mam również ten sam numer: XCode - Build Phases - Copy Bundle Resources - {zobacz obraz dostępny lub niedostępny} - add{image} - clean - delete app - Run.

0

Chciałbym dodać jeszcze jeden ważny punkt do wszystkich powyższych rozwiązań

Upewnij się Dodaj swoją Zasób obrazu do prawej tarczy

Przez pomyłkę jeśli Twórca bałagan-up powiązanie z zasobem i docelowo powstają warunki.

jeśli masz wiele celów, a następnie sprawdź, czy zasób jest ustawiony na prawidłowy cel.

Załączony przykład zrzutu ekranu w przypadku łącza do zasobów między wieloma celami.

enter image description here

Powiązane problemy