Đây là một vấn đề kỳ lạ, mà tôi chưa từng thấy cho đến tuần này.
Dưới đây là những phát hiện của tôi và giải pháp cho vấn đề của bạn.
Trong ứng dụng iPhone của tôi, tôi tải xuống hình ảnh và lưu trữ hình ảnh cục bộ và điều này luôn hoạt động tốt.
Nhưng bây giờ khi tôi chạy cùng một mã, đột nhiên không tạo được UIImage
trong số đó bằng cách sử dụng chức năng imageNamed
và giờ nó đã trở lại không.
Ba ghi chú mặc dù:
- mã chính xác này đã làm việc trước đây, sử dụng cùng một mã nguồn và .png tập tin hình ảnh. Tôi không chắc liệu bản sao XCode 6.x hoặc iOS 8.x của tôi có được cập nhật lặng lẽ trong thời gian chờ đợi hay không.
- Mã tiếp tục để hoạt động tốt (với cùng một tệp hình ảnh) trên trình mô phỏng iPhone. Nó chỉ không hoạt động trên một thiết bị thực.
- Hãy xem mã bên dưới. Khi
UIImage:imageNamed
không thành công, tôi đã chạy một số mã để kiểm tra xem tệp có thực sự tồn tại hay không. Sau đó, tôi tải dữ liệu nhị phân từ tệp bằng cách sử dụng NSData:contentsAtPath
(cũng chứng minh rằng tệp tồn tại và nằm trong thư mục bên phải), sau đó tạo một UIImage
trong số đó và hoạt động tốt.
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;
}
}
}
Như tôi đã nói, mã này cung cấp giải pháp cho vấn đề này, nhưng rất kỳ lạ là nó đột nhiên bắt đầu xảy ra. Và, tôi nên nói, tôi đã thử các đề xuất khác trong chủ đề này, làm sạch dự án, xóa DerivedData, xóa hoàn toàn ứng dụng khỏi thiết bị, v.v. nhưng chúng không tạo ra bất kỳ sự khác biệt nào.
Tôi muốn biết liệu có ai khác truy cập vấn đề này không và thấy rằng mẫu mã của tôi hoạt động cho họ.
Cập nhật
Tôi là một thằng ngốc.
Tôi không chắc chắn nếu UIImage:imageNamed
chức năng đã thay đổi hoặc một cái gì đó (và nếu như vậy, tại sao nó vẫn tiếp tục làm việc ổn trên iPhone 8.1 Simulator), nhưng tôi tìm thấy một trong những dòng sau không công việc ổn:
UIImage* img = [[UIImage alloc] initWithContentsOfFile:backgroundImageFilename];
Vì vậy, có vẻ như bạn nên sử dụng chức năng này để tải hình ảnh không phải là một phần của gói ứng dụng của bạn.
Tôi đã có những vấn đề như vậy trong quá khứ, vì vậy nó có thể giúp ... –
Tôi chắc chắn rằng tôi đã làm nó vài lần trước đây. Bây giờ nó đã hoạt động. Cảm ơn. – Gricha
Kiểm tra: 'XCode - Xây dựng các giai đoạn - Sao chép tài nguyên gói - {xem hình ảnh có sẵn hay không} thêm & chạy'. – Vicky