簡體   English   中英

圖像未顯示在表格視圖單元格中

[英]Image not show in table view cell

我正在嘗試將Unsplash API 中的圖像下載到表格視圖中,但由於某種原因,它沒有顯示在表格視圖單元格中。 根據文檔,下載圖像應該是這樣的 “photo.urls.raw” 下面是下載圖像的邏輯。 我該如何解決這個問題?

鏈接: https://github.com/lexypaul13/Photo-Finder

   **Data Model:**
    struct Photos: Codable {
        var id: String?
        var createdAt: String?
        var updatedAt: String?
        var promotedAt: String?
        var width: Int?
        var height: Int?
        var color: String?
        var blurHash: String?
        var photoDescription: String?
        var altDescription: String?
        var urls: Urls?
        var likes: Int?
        var likedByUser: Bool?
        var user: User?
    
    }
    
    // MARK: - User
    struct User:Codable {
        var id: String?
        var updatedAt: String?
        var username: String?
        var name: String?
        var firstName: String?
        var lastName: String?
        var twitterUsername: String?
        var portfolioURL: String?
        var bio: String?
        var location: String?
        var instagramUsername: String?
        var totalCollections: Int?
        var totalLikes: Int?
        var totalPhotos: Int?
        var acceptedTos: Bool?
    
        enum CodingKeys: String, CodingKey {
            case id = "id"
            case updatedAt = "updated_at"
            case username = "username"
            case name = "name"
            case firstName = "first_name"
            case lastName = "last_name"
            case twitterUsername = "twitter_username"
            case portfolioURL = "portfolio_url"
            case bio = "bio"
            case location = "location"
            case instagramUsername = "instagram_username"
            case totalCollections = "total_collections"
            case totalLikes = "total_likes"
            case totalPhotos = "total_photos"
            case acceptedTos = "accepted_tos"
        }
    }
    
    // MARK: - Urls
    struct Urls: Codable {
        var raw: String?
        var full: String?
        var regular: String?
        var small: String?
        var thumb: String?
    
        enum CodingKeys: String, CodingKey {
            case raw = "raw"
            case full = "full"
            case regular = "regular"
            case small = "small"
            case thumb = "thumb"
        }
    }
    typealias Photo = [Photos]

**Network Call:**

 func downloadImage(from urlString: String, completed: @escaping (UIImage?) -> Void) {  
         let cacheKey = NSString(string: urlString) //creates cacheKey to store in image variable
        let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
        
        guard let url = URL(string: imagesBaseURLSTring) else {
            completed(nil)
            return
        }
        
        if let image = cache.object(forKey: cacheKey) {  //check if image is there
            completed(image)
            return
        }
        let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
            guard let self = self,
                  error == nil,
                  let response = response as? HTTPURLResponse, response.statusCode == 200,
                  let data = data,
                  let image = UIImage(data: data) else {
                completed(nil)
                return
            }
            self.cache.setObject(image, forKey: cacheKey)
            completed(image)
        }
        task.resume()
    }
    

Update UI:
    

    func setTableCell(_ photos:Photos){
                updateUI(userName: photos.user?.username, fullName:photos.user?.name, date: photos.createdAt, photo: photos.urls?.thumb)
            }
           

 
private func updateUI(userName:String?,fullName:String?,date:String?,photo:String?){
            self.userName.text = userName
            self.fullName.text = fullName
            self.date.text = date
            downloadImage(photo ?? "")
        }
        
        func downloadImage(_ url:String)  {
            NetworkManger.shared.downloadImage(from:url){ [weak self] image in
                   guard let self = self else { return }
                   DispatchQueue.main.async {
                    self.photoImage.image = image
                   }
                
            }
        }

如果您嘗試放置調試點並檢查流程,您會發現以下代碼和平存在問題:

let cacheKey = NSString(string: urlString) //creates cacheKey to store in image variable
    let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
    // Here imagesBaseURLSTring is nil, so image is not downloaded and it is completed with nil. imagesBaseURLSTring is nil because of imageURL.urls is nil
    guard let url = URL(string: imagesBaseURLSTring) else {
        completed(nil)
        return
    }

這里的imagesBaseURLSTring為nil,所以不下載圖片,用nil補全。 imagesBaseURLSTring 為 nil,因為 imageURL.urls 為 nil。 請檢查您的邏輯,為什么它是零。

只是為了測試您的下載部分,您可以檢查以下內容:

//let imagesBaseURLSTring = imageURL.urls?.thumb ?? "No image"
let imagesBaseURLSTring = urlString

暫無
暫無

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

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