gpt4 book ai didi

ios - TableView 中的 UIImageView 在单击或设备旋转之前不显示

转载 作者:可可西里 更新时间:2023-11-01 00:37:38 26 4
gpt4 key购买 nike

我正在学习 swift/IOS,当 imageView 设置在传递给 dispatch_async(dispatch_get_main_que) 的闭包中时,我遇到了在表格 View 单元格中显示图像的问题。

这是我为表格 View 返回单元格的代码。请注意,调度调用已被注释掉。在这种状态下一切正常。 (图像显示没有任何交互)

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell
if indexPath.section == 3 {
cell = tableView.dequeueReusableCellWithIdentifier("imageCell", forIndexPath: indexPath) as! MentionedImageTableViewCell
if let images = tweetSections?[3].items as? [MediaItem] {
let imageUrl = images[indexPath.row].url
let qos = Int(QOS_CLASS_USER_INTERACTIVE.value)
let queue = dispatch_get_global_queue(qos, 0)
println("feching image for cell = \(cell)")
// dispatch_async(queue) {
if let imageData = NSData(contentsOfURL: imageUrl), let image = UIImage(data: imageData) {
println("fetch complete")
// dispatch_async(dispatch_get_main_queue()) {
println("posting image = \(image), to cell = \(cell)")
cell.imageView?.image = image
println("cells image = \(cell.imageView?.image)")
// }
}
// }
}
} else {
cell = tableView.dequeueReusableCellWithIdentifier("textCell", forIndexPath: indexPath) as! UITableViewCell
if let keywords = tweetSections![indexPath.section].items as? [Tweet.IndexedKeyword] {
let text = keywords[indexPath.row].keyword
cell.textLabel?.text = text
}
}
return cell
}

但是当我将更新包装在传递给 dispatch_async(get_main_que() {}) 的闭包中时,图像直到我点击它或旋转设备后才会出现请注意,此代码与上面的代码之间的唯一区别是有两行未注释。笔记;这一切都在模拟器上

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: UITableViewCell
if indexPath.section == 3 {
cell = tableView.dequeueReusableCellWithIdentifier("imageCell", forIndexPath: indexPath) as! MentionedImageTableViewCell
if let images = tweetSections?[3].items as? [MediaItem] {
let imageUrl = images[indexPath.row].url
let qos = Int(QOS_CLASS_USER_INTERACTIVE.value)
let queue = dispatch_get_global_queue(qos, 0)
println("feching image for cell = \(cell)")
// dispatch_async(queue) {
if let imageData = NSData(contentsOfURL: imageUrl), let image = UIImage(data: imageData) {
println("fetch complete")
dispatch_async(dispatch_get_main_queue()) {
println("posting image = \(image), to cell = \(cell)")
cell.imageView?.image = image
println("cells image = \(cell.imageView?.image)")
}
}
// }
}
} else {
cell = tableView.dequeueReusableCellWithIdentifier("textCell", forIndexPath: indexPath) as! UITableViewCell
if let keywords = tweetSections![indexPath.section].items as? [Tweet.IndexedKeyword] {
let text = keywords[indexPath.row].keyword
cell.textLabel?.text = text
}
}
return cell
}

最佳答案

如果你必须以某种方式将图像分配到 GCD 中(可能用于异步图像加载),你必须调用以下方法,第二个是可选的,取决于你对更新频率的期望:

cell.setNeedsLayout() //invalidate current layout
cell.layoutIfNeeded() //update immediately

我猜 |tableView:cellForRowAtIndexPath:|隐式调用上述方法。所以在大多数情况下你不必关心这个。但是如果你是异步的,上面的数据源方法调用这些方法的时候,根本就没有图像可以显示。所以有时稍后,你得到图像,你必须在图像分配后显式调用它以获得正确的 View 更新。

经过一些测试,数据源方法简单地调用了两个方法|setNeedsDisplay|如果之前没有调用,则只调用一次,然后 |setNeedsLayout|几次

关于ios - TableView 中的 UIImageView 在单击或设备旋转之前不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066625/

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