gpt4 book ai didi

swift - 为什么我必须单击该行才能显示已加载的图像?

转载 作者:行者123 更新时间:2023-11-30 14:03:00 25 4
gpt4 key购买 nike

我正在完成 Paul Hegarty 的斯坦福类(class)“使用 Swift 开发 iOS 8 应用程序”的作业 4。该作业正在开发一个应用程序,搜索 Twitter 以获取一些推文并将它们显示在推文 TableView 中。如果我单击推文 TableView 的一行,它会转到一个详细信息 TableView ,该 View 在四个部分中显示该推文的主题标签、网址、用户提到的和附加的媒体照片。

媒体照片部分在名为 mediaCell 的自定义单元格中显示推文中附加的图像,该单元格仅包含单个 imageView。 但是我发现,使用 NSData(contentsOfURL:) 和 UIImage(data:) 方法将图像 URL 中的图像加载到 mediaCell 的 imageView 后,imageView 的图像不会显示,直到我单击具有没有继续。只需点击一下即可显示图像,如果不点击,图像仅存在于内存中,无法在相应的 imageView 中绘制。

下面是下载 URL 中的图像并将其加载到 mediaCell 中的 imageView 的代码。

mediaCell 是一个自定义的 UITableViewCell,它只有一个名为 mediaImageView 的 imageView。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(Storyboard.tweetDetailGeneralCellIdentifier, forIndexPath: indexPath)

// Configure the cell...
switch indexPath.section {
case 0:
cell.textLabel?.text = tweet.hashtags[indexPath.row].keyword
return cell
case 1:
cell.textLabel?.text = tweet.urls[indexPath.row].keyword
return cell
case 2:
cell.textLabel?.text = tweet.userMentions[indexPath.row].keyword
return cell
case 3:
let mediaCell = tableView.dequeueReusableCellWithIdentifier(Storyboard.tweetDetailMediaCellIdentifier, forIndexPath: indexPath) as! TweetDetailMediaCell
if !tweet.media.isEmpty {
for media in tweet.media {
let qos = Int(QOS_CLASS_USER_INITIATED.rawValue)
let queue = dispatch_get_global_queue(qos, 0)
dispatch_async(queue){
let imageData = NSData(contentsOfURL: media.url)
if imageData != nil {
dispatch_async(dispatch_get_main_queue()) {
mediaCell.mediaImageView.image = UIImage(data: imageData!)
print("mediaCellImage is loaded")
}
}
}
}
}
return mediaCell
default: break
}
return cell
}

当打印“mediaCellImage is returned”时,图像加载应该完成,但如果我不单击该行,图像永远不会显示。如果我点击一次,它就会显示出来。

如果我在打印后添加“mediaCell.mediaImageView.setNeedsDisplay”,则不会发生任何变化(“mediaCellImage已加载”)。

最佳答案

问题是,当加载图像时,mediaCell 可能会因另一行而出列。

当加载图像时(在主队列内)再次使单元出队:

if let mediaCell = tableView.cellForRowAtIndexPath(indexPath) as? TweetDetailMediaCell {
mediaCell.mediaImageView.image = UIImage(data: imageData!)
}

关于swift - 为什么我必须单击该行才能显示已加载的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32764265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com