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ć:
- 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.
- 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.
- 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.
Miałem takie problemy również w przeszłości, więc mogłoby to pomóc ... –
Jestem pewien, że zrobiłem to kilka razy wcześniej. Teraz zadziałało. Dzięki. – Gricha
Sprawdź: 'XCode - Fazy kompilacji - Kopiuj zasoby pakietu - {patrz obraz jest dostępny lub nie jest dostępny} add & run'. – Vicky