【问题标题】:TableView assigning image to cell in TVCTableView将图像分配给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

标签: ios swift uitableview uiimage tableview


【解决方案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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多