cell.imageView未显示图像

3

我有一个tableView,想在cell.imageView中显示一张图片,但无论我做什么都不会显示图片。imageView的子类是PFImageView。我已经检查过PFFile和UIImage不为nil了。我错在哪里?

这是我目前尝试过的:

转换成UIImage

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> PFTableViewCell! {
    
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as PFTableViewCell
    
    cell.textLabel?.text = object.objectForKey("title") as NSString
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd" // superset of OP's format
    let str = dateFormatter.stringFromDate(object.createdAt)
    cell.detailTextLabel?.text = str
    var theFile:PFFile = object.objectForKey("image") as PFFile
    
    theFile.getDataInBackgroundWithBlock {
        (imageData: NSData!, error: NSError!) -> Void in
        if error == nil {
            let image = UIImage(data:imageData)
            dispatch_async(dispatch_get_main_queue()) {
                cell.imageView?.image = image
            }

        }
    }
    
    
    
    
    
    
    return cell
}

你知道在“if error == nil”子句中的代码是否会执行吗?如果有错误,你应该添加一个“else”块来记录该错误。我相信你也不需要dispatch_async;我理解completion block会在主线程上运行。 - rdelmar
1个回答

2

您正在从闭包中设置图像,这很可能不在主线程上运行。您应该将代码包含在dispatch_async中:

dispatch_async(dispatch_get_main_queue()) {
    cell.imageView?.image = image
}

我认为这就是问题所在,但当然我无法测试它,因为我没有您所有的源代码。无论如何,即使那样不能解决问题,你也必须这样做,因为UI组件必须从主线程更新。

我已经更新了代码,但在cell.imageview行上出现了以下错误:无法将表达式类型“(dispatch_queue_t, 0 -> () -> $t3)”转换为类型()。 - gamerChristian
4
这是因为可选链表达式会返回一个非空值。由于这是一个单表达式闭包,它将从闭包中隐含地返回该值,而该闭包并没有期望这个值。你需要对可选项进行解包。 - Tom Erik Støwer
@TomErikStøwer的评论应该解决了编译问题。但是你应该避免使用(代码)答案来编辑你的原始问题 - 这会使读者感到困惑。现在我的答案似乎毫无用处,容易被downvote,因为我的建议已经包含在你的问题中了。在这种情况下,最好在原始问题下面添加一个更新部分,或者至少添加一个说明,说明原始代码是基于答案修改的。 - Antonio
@Antonio 没有帮助我。 - Dmitry
2
好的,明白了 (cell.imageView?.image = image)! - Dmitry
@TomErikStøwer永远不会记得那个,谢谢! - rob5408

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接