正如标题所暗示的,im使用JSQMessagesViewController。我希望每个用户都有自己的头像UIImage将从FirebaseDatabase的网址,并通过提取这一点。SDWebImage。我可以把这个放进去;
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的方法;
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
return ???????????????????????????????????????
}
但似乎不能组织出与cellForItemAt中相同的逻辑?有人能帮上忙吗?非常感谢。
更新:- ******************************************************************
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
}
这和它打印出来的图像大小没有错误。但是,图像不会从占位符图像更改!...
发布于 2017-03-19 21:24:33
万岁!我终于从医生那里明白了.在所有的地方。
您必须按如下方式初始设置现有的头像...
所以在下面;
let message = messages[indexPath.item]
添加以下内容。
if avatarImage?.avatarImage == nil {
avatarImage?.avatarImage = SDImageCache.shared().imageFromDiskCache(forKey: message.senderId)
}
然后检查头像是否存在,如果不存在,就去获取它们!但是将它们设置为您在现有头像中的密钥。例如(message.senderID)
if image != nil {
manager.imageCache.store(image, forKey: message.senderId)
DispatchQueue.main.async
{
avatarImage!.avatarImage = image
avatarImage!.avatarHighlightedImage = image
}
还有Bam!头像到处都是。希望这对某些人有帮助!
https://stackoverflow.com/questions/42864283
复制相似问题