TableView将图像分配给TVC中的单元格

Posted

技术标签:

【中文标题】TableView将图像分配给TVC中的单元格【英文标题】:TableView assigning image to cell in TVC 【发布时间】:2017-03-24 11:17:33 【问题描述】:

此代码有问题。基本上,我正在尝试使用从 Twitter 中提取的图像填充表格单元格。这里的 url 字段的值为 http://pbs.twimg.com/profile_images/796924570150301696/35nSG5nN_normal.jpg 但由于某种原因 print("REACHED") 从未打印。任何帮助/建议表示赞赏!

代码sn-p:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: tIdentifier, for: indexPath) as! TweetCell
    let tweet = tweets[indexPath.section][indexPath.row]
    let url = tweet.user.profileImageURL!
    print(url.absoluteString)
    let data = try? Data(contentsOf: url)
    if (data == nil)
     else 
        print("REACHED")
        cell.avatarImage = UIImage(data: data!)
    
    cell.tweet = tweets[indexPath.section][indexPath.row]
    return cell

【问题讨论】:

let data = try? Data(contentsOf: url) 避免这种情况!它同步并阻塞了 UI。 @Larme 对替代方法有什么建议吗? 这个库可能有用:github.com/Alamofire/AlamofireImage 【参考方案1】:

这对我有用:

func example() 
    let cell = UITableViewCell()
    let url = URL(string: "http://pbs.twimg.com/profile_images/796924570150301696/35nSG5nN_normal.jpg")

    do 
        let data = try Data(contentsOf: url!)
        print("REACHED")
        cell.imageView?.image = UIImage(data: data)
     catch 
        print("received this error:\n\(error.localizedDescription)")
    

如果它不能立即起作用,至少你会收到一条错误消息来帮助你解决问题。祝你好运!

编辑: 您应确保已更新 Info.plist 以包含以下条目:

应用传输安全设置

没有这个,您将无法访问其他网站。 Transport security has blocked a cleartext HTTP

【讨论】:

我没有看到文件的路径。在上面加载文件的方法中添加断点。逐步检查并进行验证。 太棒了!很高兴我能帮上忙! 这最初给了我一个“无法打开文件错误”,这导致我重新检查我的 plist 源代码,并通过添加 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 我能够让它运行。谢谢@Mozahler 有趣的是,这将是我的下一个建议。我正要从我的 Info.plist 中复制和粘贴。我在一个设置了 NSAPPTransportSecurity 的应用程序中快速测试了代码。【参考方案2】:

轻松生活的一些小窍门……

不要强行展开 不要在主队列上下载 不要暴露你手机的IBOutlets
let imageQueue = DispatchQueue(label: "imageQueue", qos: DispatchQoS.background)

class TweetCell: UITableViewCell 

    @IBOutlet fileprivate var avatarImage: UIImageView!

    var tweet: Tweet         
        didSet 
            guard let url = tweet.user.profileImageURL else  return 

            loadImage(url: url)
        
    

    fileprivate func loadImage(url: URL) 
        imageQueue.async 

            do 
                let data = try Data(contentsOf: url) 

                DispatchQueue.main.async 
                    self.avatarImage.image = UIImage(data: data)        
                

             catch 
                // Handle error
                
        
    


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: tIdentifier, for: indexPath) as! TweetCell
    cell.tweet = tweets[indexPath.section][indexPath.row]
    return cell

【讨论】:

以上是关于TableView将图像分配给TVC中的单元格的主要内容,如果未能解决你的问题,请参考以下文章

swift如何将图像传递给可点击的tableview单元格?

将远程图像加载到 Tableview 单元格中

如何将 viewController 中的数据分配给 tableViewCell 标签?

如何通过stackview将图像添加到tableview单元格

如何以编程方式将不同单元格的不同图像添加到 tableView (Swift)

无法访问容器视图的 tableview 控制器元素