iOS UIImageView不会自动刷新

时间:2015-11-05 05:51:16

标签: swift uiimageview uikit ios9

我按照this wonderful tutorial学习iOS编程,除了我定位iOS 9并进行一些小修改。

在下面的tableView()函数中,我可以下载缩略图图像并调用我的处理程序,从两个日志记录行的控制台打印中可以看出。但是,当应用程序运行时(在模拟器中),我必须单击每个表格单元格以显示图像。我试图在refresh()或表格单元格中查看是否有UIImageView或类似内容,但未找到任何内容。

如何在收到数据时立即显示图像?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier)!
    let album = self.albums[indexPath.row]

    // ... setting up other cell's data, see the tutorial link

    // Start by setting the cell's image to a static file
    // Without this, we will end up without an image view!
    cell.imageView?.image = UIImage(named: "Blank52")

    let request: NSURLRequest = NSURLRequest(URL: thumbnailURL)
    let urlSession = NSURLSession.sharedSession()
    urlSession.dataTaskWithRequest(request, completionHandler: {(data, response, error) -> Void in
        print("received thumbnail \(thumbnailURLString)") // reached
        if error == nil {
            // Convert the downloaded data in to a UIImage object
            let image = UIImage(data: data!)
            // Update the cell
            dispatch_async(dispatch_get_main_queue(), {
                print("...dispatched thumbnail image for \(thumbnailURLString)") // reached
                if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                    cellToUpdate.imageView?.image = image
                }
            })
        }
    }).resume()

    return cell
}

5 个答案:

答案 0 :(得分:2)

这部分没有意义:

if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
    cellToUpdate.imageView?.image = image

这似乎在创造一个无限循环。每次拨打cellForRowAtIndexPath都会导致cellForRowAtIndexPath的其他电话。

我想你的意思是:

cell.imageView?.image = image

你已经知道了这个细胞。您刚刚在调用此块之前创建了它。你不需要再查一次了。

答案 1 :(得分:1)

我想出了一个解决方法。如果我也轻微更新文本,图像就会显示,而不会单击表格视图单元格。

cellToUpdate.imageView?.image = image
cellToUpdate.textLabel?.text = "\(album.title) " // a space is added to the end to make a difference and force the cell to be updated

听起来像UITableViewCell(或模拟器?没有在真实设备上尝试过)的错误给我。

答案 2 :(得分:0)

为什么你只是尝试没有dispatch_async(dispatch_get_main_queue())部分。

dispatch_async(dispatch_get_main_queue(), {
            print("...dispatched thumbnail image for \(thumbnailURLString)") // reached
            if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                cellToUpdate.imageView?.image = image
            }
        })

cell.imageView?.image = image

答案 3 :(得分:0)

当您获得尝试更新的单元格时,可能需要强制转换单元格。

dispatch_async(dispatch_get_main_queue(), {
        print("...dispatched thumbnail image for \(thumbnailURLString)") // reached
        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) as! UITableViewCell {
            cellToUpdate.imageView?.image = image
    }
})

答案 4 :(得分:0)

Swift 5 设置图像后,只需将以下代码放入 cellForRowAt 委托方法中即可。

        UIView.performWithoutAnimation {
           tableView.beginUpdates()
           tableView.endUpdates()
        }
    // Full Method
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                guard let cell = tableView.dequeueReusableCell(withIdentifier: "PhotoCell", for: indexPath) as? PhotoCell else { return UITableViewCell() }
                let model = self.arrPhotos?[indexPath.row]
// Below method download image from url using asycn
                SwiftHelper.downloadImageFrom(strUrl: model?.url ?? "") {[weak self] (img) in
                    guard let _ = self, let image = img else { return }
                    print("ImgDownloaded")
                    cell.imgView.image = image
                   // cell.layoutIfNeeded()
                    UIView.performWithoutAnimation {
                       tableView.beginUpdates()
                       tableView.endUpdates()
                    }
                }
                return cell
            }

要对图像进行动画处理,可以删除performWithoutAnimation块。