Swift - 将图像添加到资产库中的tableview单元格

时间:2015-06-18 19:01:51

标签: ios swift uitableview

我正在尝试将图像添加到tableview单元格,但没有太多运气让它显示出来。

图像正在从文件系统(I println()结果)加载为UIImage,但我似乎无法将其放入单元格。在关闭后放置println()会显示在返回单元格后图像全部被加载。

这是我的代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell") as! UITableViewCell

    let note = notes[indexPath.row]
    let nsURL = NSURL(string: note.valueForKey("url") as! String)!
    var loadError: NSError?
    var image: UIImage?

    assetsLibrary!.assetForURL(nsURL, resultBlock: { (asset) -> Void in
            if let ast = asset {
                let iref = ast.defaultRepresentation().fullResolutionImage().takeUnretainedValue()
                image = UIImage(CGImage: iref)
                println("The loaded image: \(image)")
            }
        }, failureBlock: {(error) -> Void in
            loadError = error
        })

    cell.textLabel!.text = note.valueForKey("title") as? String
    cell.imageView!.image = image

    return cell
}

当我用以下内容替换闭包来加载项目本身的图像时,它会显示在表格中。这让我相信这不是因为故事板的设置方式存在问题。

UIImage(named: transportItems[indexPath.row]) 

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

它不起作用。 cellForRowAtPathIndex是一个同步例程。 assetForURL是一个异步例程。它将在cellForRowAtPathIndex返回后很长时间返回数据。

这是你应该做的:有一个方法cachedAssetForURL,它立即返回资产,或者返回nil。如果它返回资产,则存储它。请记住,这必须尽可能高效,因为当用户在图像中上下滚动时会调用此方法。

如果方法返回nil,则在后台触发下载。下载完成后,甚至不要尝试将图像存储在单元格中 - 此时,相同的单元格可能会显示完全不同的对象!而是存储数据,以便cachedAssetForURL能够返回资产,并使表视图的行无效。

答案 1 :(得分:0)

在块中触发通知(它是异步的),通过设置imageview并重新加载视图来管理它。

答案 2 :(得分:0)

正如@ gnasher729所指出的那样,我遇到的根本问题是同步和异步调用的混乱。重写代码以考虑到这一点并包含缓存,我有以下工作解决方案。

function fetchTransMain($trans, $itemID, $echo){
     $str="";
     ob_start();
     foreach($trans as $key => $val){
         if($val["ID"] == $itemID){
               echo $val["trans"];   // Echo the value
          }
     }

     $str = ob_get_buffer();
     if($echo) ob_end_flush();
     else ob_end();
     return $str;
}

这可以进一步改进,以便从主线程中获得更多。