首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用SDWebImage的JSQMessagesViewController中的用户特定化身

使用SDWebImage的JSQMessagesViewController中的用户特定化身
EN

Stack Overflow用户
提问于 2017-03-18 02:00:10
回答 1查看 1.2K关注 0票数 2

正如标题所暗示的,im使用JSQMessagesViewController。我希望每个用户都有自己的头像UIImage将从FirebaseDatabase的网址,并通过提取这一点。SDWebImage。我可以把这个放进去;

代码语言:javascript
运行
复制
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as! JSQMessagesCollectionViewCell

    let message = messages[indexPath.item]

    if let messageID = message.senderId {
        rootRef.child("users").child(messageID).observe(.value, with: { (snapshot) in

            if let profileURL = (snapshot.value as AnyObject!)!["profileURL"] as! String! {
                let profileNSURL: NSURL = NSURL(string: profileURL)!
                cell.avatarImageView.sd_setImage(with: profileNSURL as URL)
            }
        })
    }
            return cell
}

但是,每次您发送一条消息并重新加载该表时,图像都会消失,然后重新出现,因为我假设它会再次遍历所有的索引路径。

下面是处理化身的dataSource的方法;

代码语言:javascript
运行
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
 return ???????????????????????????????????????
}

但似乎不能组织出与cellForItemAt中相同的逻辑?有人能帮上忙吗?非常感谢。

更新:- ******************************************************************

代码语言:javascript
运行
复制
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {

    let placeHolderImage = UIImage(named: "Circled User Male Filled-25")
    let avatarImage = JSQMessagesAvatarImage(avatarImage: nil, highlightedImage: nil, placeholderImage: placeHolderImage)

    let message = messages[indexPath.item]

    if let messageID = message.senderId {

        rootRef.child("users").child(messageID).observe(.value, with: { (snapshot) in

            if let profileURL = (snapshot.value as AnyObject!)!["profileURL"] as! String! {

                let profileNSURL: NSURL = NSURL(string: profileURL)!

                // download avatar image here somehow!?
                let manager: SDWebImageManager = SDWebImageManager.shared()
                manager.downloadImage(with: profileNSURL as URL!, options: [], progress: { (receivedSize: Int, actualSize: Int) in
                    print(receivedSize, actualSize)
                }, completed: { (image, error, cached, finished, url) in
                    avatarImage!.avatarImage = image
                })
            }
        })
    }

    return avatarImage
}

这和它打印出来的图像大小没有错误。但是,图像不会从占位符图像更改!...

EN

回答 1

Stack Overflow用户

发布于 2017-03-19 21:24:33

万岁!我终于从医生那里明白了.在所有的地方。

您必须按如下方式初始设置现有的头像...

所以在下面;

代码语言:javascript
运行
复制
let message = messages[indexPath.item]

添加以下内容。

代码语言:javascript
运行
复制
       if avatarImage?.avatarImage == nil {
       avatarImage?.avatarImage = SDImageCache.shared().imageFromDiskCache(forKey: message.senderId)
       }

然后检查头像是否存在,如果不存在,就去获取它们!但是将它们设置为您在现有头像中的密钥。例如(message.senderID)

代码语言:javascript
运行
复制
if image != nil {
manager.imageCache.store(image, forKey: message.senderId)

DispatchQueue.main.async
{                                
avatarImage!.avatarImage = image
avatarImage!.avatarHighlightedImage = image
}

还有Bam!头像到处都是。希望这对某些人有帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42864283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档