簡體   English   中英

直到選擇了單元格,URL中的Swift tableview圖像才會顯示

[英]Swift tableview image from URL not showing until cell is selected

我正在遍歷URL數組,以便在表格單元格中顯示圖像。 由於某些原因,只有選中該單元格,圖像才會顯示。 一次只能顯示一張圖像,因此當我選擇一個單元格以顯示圖像時,一旦選擇另一個單元格,它將再次消失。 我不確定是什么問題,因為文本顯示沒有問題:

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "resultCell", for: indexPath) as! ResultsTableViewCell
   var place = [String]()
    var img = [String]()

    if imageUrls.count == venueIds.count {
        for (key,value) in restaurantInfo {
            place.append(value[0])
            img.append(value[1])
        }
            let search = img[indexPath.row]
            Alamofire.request(search).responseImage { response in
                if let image = response.value {
                    cell.imageSelection.image = image
                }
                else{
                    print(response.result.error!)
                }
        }
        cell.newLabel.text = place[indexPath.row]
    }
    return cell
}

嘿,理想情況下,您不應從cellForRowAt方法調用Web服務,而應為表准備一個模型並事先獲取數據。

要么

同樣,圖像獲取也可以異步完成,這樣表的滾動不會變得遲鈍並且圖像可以正確顯示。

DispatchQueue.main.async {}

與其嘗試將圖像添加到單元格中,不如將圖像作為cell.backgroundImage添加到tableView中。 希望能解決您的問題!

很難說沒有在自定義單元格或didSelectRow方法中看到任何內容,但我的猜測是這種情況正在發生,因為在Alamofire請求完成之前,將在每個單元格上調用cellForRowAt

tableView(_:cellForRowAt:)經常被調用-每次要將一個單元從隊列中取出並顯示在屏幕上時。 我建議不要像曼西所說的那樣在這里打網絡電話。 您也可能不想在該函數中執行該循環來獲取餐廳信息。 每當該單元將要出隊並出現在屏幕上時,將為每個單元調用循環和服務調用-這將變得非常昂貴。 通過此代碼還可以看到,當表格視圖的某個單元格脫離屏幕然后即將再次出現在屏幕上時,即使先前已經下載了該單元格,它也會嘗試重新下載圖像(因為cellForRow將再次對該單元格進行調用)。

文本標簽顯示沒有問題,因為它不依賴於任何網絡調用,並且可以立即繪制。 我的猜測是您的didSelectRow或自定義單元格告訴該單元格在被選中時會重新繪制自身,這就是為什么當您選擇該圖像時會顯示該圖像的原因。

我建議將循環和請求移到該函數之外,並創建某種數據結構來保存這些值。 在等待請求完成時,您可能需要在圖像視圖中實現加載動畫,並且圖像的數據結構可以充當緩存。 有幾種不同的解決方法-這些只是一般性建議。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM