2017-06-27 72 views
0

嘿,大家會喜歡我的第一個問題的一些幫助。我已經花了很多時間去參加論壇,但我仍然在努力去理解我在哪裏出錯。 URL字符串在JSON中解析得很好,但是它在我創建的UIImageView中不顯示爲圖像。代碼編譯正常,其他所有內容都顯示。我假設我必須將字符串類型的URL轉換爲UIImageView,但我不斷收到錯誤。Swift3 - UIImageView沒有從解析的JSON數據中出現

這是EventCell類的片段。

class EventCell: UICollectionViewCell { 

var event: Event? { 
    didSet { 

     if let eventName = event?.title { 
      eventTitle.text = eventName 
     } 

     eventSubtitle.text = event?.subtitle 

     eventTags.text = event?.tags 

     if let imageName = event?.imageURL 
     { 
      imageView.image = UIImage(named: imageName) 
     } 
    } 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    setupViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 


let imageView: UIImageView = { 
    let iv = UIImageView() 
    iv.translatesAutoresizingMaskIntoConstraints = false 
    iv.contentMode = .scaleAspectFill 
    return iv 
}() 

這裏是Event類本身的片段。

var id: NSNumber? 
var title: String? 
var imageURL: String? 
var subtitle: String? 
var tags: String? 
var desc: String? 

override init(){} 

init(event: NSDictionary) 
{ 
    if let val = event["ID"] as? NSNumber 
    { 
     id = val; 
    } 

    if let val = event["Title"] as? String 
    { 
     title = val; 
    } 

    if let val = event["Subtitle"] as? String 
    { 
     subtitle = val; 
    } 

    if let val = event["Tags"] as? String 
    { 
     tags = val; 
    } 

    if let val = event["Description"] as? String 
    { 
     desc = val; 
    } 

    if let val = event["image"] as? String 
    { 
     imageURL = val; 
    } 
} 

任何幫助將不勝感激!謝謝!

+1

你不能只從一個URL字符串初始化'UIImage'。您需要下載圖像數據,然後從數據進行初始化。 – ovo

+0

確保您有一個名爲imageName的文件。您不能使用外部鏈接來創建圖像。 – CloudTuan

+0

更新問題與'錯誤',你得到了。同時更新代碼片段,你會得到'error' –

回答

0

添加此擴展

extension UIImageView { 
    public func imageFromUrl(urlString: String) { 
     if let url = URL(string: urlString) { 
      URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) in 
       if (error != nil) { 
        print(error?.localizedDescription ?? "no errror") 
       } 
       else { 
        if let image = UIImage(data: data!) { 
         DispatchQueue.main.async { 
          self.image = image 
         } 
        } 
       } 
      }).resume() 
     } 
    } 
} 

用法:

imageView.imageFromUrl(urlString: "http://linktoyourimage.com") 
2

初始化程序UIImage(named:)需要已存儲在捆綁包中的圖像的名稱。在你的情況下,你想從URL加載圖像。你應該做的是從String創建一個URL,然後加載該URL的內容爲NSData,最後從該Data創建一個UIImage。實現這一目標的最快方式是

if let imageURLString = event?.imageURL { 
    let imageURL = URL(string: imageURLString!) 
    let imageData = NSData(contentsOf: imageURL!) 
    imageView.image = UIImage(data: imageData as! Data) 
} 

注意

幾點考慮

  • 這不是從一個URL加載圖像的最佳方法。您還應該查看async請求。但是,這是最快的實現方式,應該使代碼正常工作。
  • 該代碼片段的語法爲Swift 3。我假設你可以將其轉換爲Swift 2如果這就是你使用的是什麼
+0

非常感謝馬利克!代碼現在運行並且圖像編譯。但是,你是對的。應用程序非常緩慢,幾乎無法使用。你還會推薦從單獨的線程加載圖像嗎? –

+1

很高興能有所幫助。是的,最好將它加載到單獨的線程中。看看阿拉莫菲爾(https://github.com/Alamofire/Alamofire) – Malik

0

按照蘋果文檔UIImage(named:)預計在你的應用程序包的名稱命名。您可以通過dataWithContentsOfURL:方法傳遞圖像的網址。雖然使用這種方法很好,但您只需要像dataWithContentsOfURL一樣異步處理:是一個同步請求,並阻止主線程直到下載完成。

考慮使用SDWebImage一個UIImageView擴展,它增加了管理圖像的下載和顯示。它還支持您可以提供的佔位符圖像,以指示下載正在進行中。

希望它有幫助。快樂編碼!

+0

謝謝幸運shubra。是的,我現在可以看到已經實施了這個請求使得應用程序無法使用的修復程序,因此必須查看此擴展程序。再次感謝。 –

+0

很高興你能解決你的問題。 SDWebImage很容易使用UIImageView擴展。查看上面鏈接的詳細信息。 – luckyShubhra