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

Phương thức này chỉ trả về giá trị null trên thiết bị.iOS - UIImage imageNamed: trả về null trên thiết bị

Tôi biết đó là sự cố đã biết và thường là do thực tế là trình mô phỏng không phân biệt chữ hoa chữ thường. Tôi đã thử các giải pháp được đề xuất tại đây: UIImage imageNamed returns nil

Nhưng không có gì hiệu quả đối với tôi.

Trường hợp rất đơn giản: Tôi có 4 tệp có tên: [email protected]~ipad.png, [email protected]~iphone.png, Bar ~ ipad.png, Bar ~ iphone.png. Tất cả trong số họ đang trong dự án với hộp kiểm mục tiêu kiểm tra.

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

Dòng mã đó không cho tôi biết thiết bị và tôi thực sự không biết mình đang làm gì sai.

Trả lời

5

Gần đây tôi cũng gặp vấn đề như vậy.

Sau khi chơi với tên tập tin và đường dẫn đôi khi nó giúp ích khi bạn làm sạch và xây dựng lại dự án của bạn.

+0

Tôi đã có những vấn đề như vậy trong quá khứ, vì vậy nó có thể giúp ... –

+0

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

+0

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

4

Tôi đã tìm thấy chính mình trong tình huống tương tự gần đây.

Giải pháp trong trường hợp của tôi là thêm phần mở rộng vào tên tệp.

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

Cảm ơn bạn. Chỉ cần cố gắng đó và tiếc là nó đã không giúp đỡ trong trường hợp của tôi. – Gricha

+0

trong trường hợp png mà không nên quan trọng .. có thể bạn đã phải đối mặt với một fileformat –

+2

Không có png, và downvote không có vẻ rất thích hợp. –

1

Dọn dẹp hoàn toàn xây dựng của bạn và làm lại nó:

  1. xóa các ứng dụng từ thiết bị
  2. tùy chọn-sạch toàn bộ xây dựng thư mục trong Xcode (⌘-Shift-K)
  3. bỏ xcode
  4. xóa ~/Library/Developer/Xcode/DerivedData
  5. restart xcode, xây dựng và chạy
0

Tôi gặp sự cố này và chỉ sửa lỗi này. Tôi liệt kê giải pháp dưới đây làm tài liệu tham khảo.

Tôi có một số hình ảnh và sử dụng [UIImage imageNamed: filePath] để hiển thị chúng. Tất cả các hình ảnh hiển thị tốt ngoại trừ 1 trên giả lập/thiết bị, nhưng tất cả chúng có thể được nhìn thấy trên OS X. Đối với hình ảnh đó, [UIImage imageNamed] luôn trả về giá trị rỗng.

Sau vài phút điều tra, tôi thấy rằng hình ảnh gây ra vấn đề lớn hơn rất nhiều về kích thước tệp: 4.1M. Những người khác là tất cả khoảng 800kb. Chúng có kích thước gần giống nhau về kích thước.

Sau đó, tôi cố mở nó trong trình chỉnh sửa hình ảnh, sau đó lưu lại. Sau đó, kích thước giảm xuống còn 800k. vấn đề được giải quyết.

Những lý do tôi đoán,

  1. [UIImage imageNamed: filepath] có một giới hạn kích thước tập tin tối đa? (khả năng thấp, nhưng cần phải kiểm tra tài liệu chính thức)

  2. chính hình ảnh đó có một số lỗi. Nhưng OS X có dung sai tốt hơn iOS. vì vậy iOS không thể đọc và trả về giá trị rỗng.Vấn đề này giống như OS X có thể chơi nhiều loại tệp video hơn iOS vì nó hỗ trợ nhiều codec hơn.

vì vậy nếu bạn gặp sự cố này trong tương lai, hãy dành vài giây để xem kích thước tệp. Hy vọng giúp đỡ.

1

này chỉ xảy ra với tôi, và để khám phá là rất khó khăn: Tôi có một hình ảnh mà nơi con số không chỉ trên thiết bị

logoWhite.png 

mã của tôi:

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

Sau một thời gian gỡ lỗi, Tôi nhận thấy rằng tên của hình ảnh bắt đầu bằng chữ hoa. Rõ ràng điều này không quan trọng trên OSX với một hệ thống tập tin bỏ qua trường hợp. Hệ thống tệp iO không phải là, vì vậy hình ảnh hoạt động trên trình mô phỏng nhưng không hoạt động trên thiết bị.

Tôi đặt cược rằng tất cả các giải pháp về làm sạch dữ liệu có nguồn gốc và xây dựng lại đã kết thúc ngẫu nhiên bằng cách đổi tên hình ảnh và điều này cũng sẽ làm điều đó. Chỉ cần đăng ở đây để tham khảo trong tương lai :)

+0

OP thực sự đã đề cập rằng anh đã kiểm tra trường hợp tên tệp vì điều đó (giả lập = phân biệt chữ hoa chữ thường so với thiết bị = phân biệt chữ hoa chữ thường) là một vấn đề nổi tiếng. Do đó, nó không phải là tên tập tin là vấn đề trong trường hợp này. – siburb

0

Đâ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ù:

  1. 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.
  2. 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.
  3. 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.

0

Tôi cũng gặp vấn đề tương tự sau đó: XCode - Build Phases - Copy Bundle Resources - {xem hình ảnh có sẵn hay không} - add{image} - clean - delete app - Run.

0

Tôi muốn thêm một điểm quan trọng hơn đối với tất cả các giải pháp trên

Hãy chắc chắn rằng bạn thêm bạn tài nguyên hình ảnh đến mục tiêu đúng

Bởi sai lầm nếu cho nhà phát triển liên kết lộn xộn-up với tài nguyên và mục tiêu sau đó điều kiện phát sinh.

nếu bạn có nhiều mục tiêu thì kiểm tra kỹ tài nguyên được đặt thành đúng mục tiêu.

Ví dụ về ảnh chụp màn hình được đính kèm trong trường hợp liên kết tài nguyên giữa nhiều mục tiêu.

enter image description here