- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在 viewDidLoad
中调用的头像函数(如果它有帮助,这就是函数,尽管我认为问题不在于函数本身:https://pastebin.com/ksHmucTX)。
在 viewDidLoad
中我称它为:
createAvatar(senderId: self.senderId, senderDisplayName: self.senderDisplayName, user: self.currentUser!, color: UIColor.lightGray)
但由于我只是传递我的信息(作为当前用户),所以在使用该应用程序时我只能看到我的头像,而看不到聊天中其他人的头像。
在 avatarImageDataForItemAt
函数中,有一个索引路径来确定哪个消息是哪个:
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
let message = messages[indexPath.row]
return avatars[message.senderId]
}
所以我想知道如何在 viewDidLoad 中获取正确的 senderId
(即发送消息的人的 ID),以便我可以将其插入 createAvatars
调用中,与我现在所拥有的相反,senderId
只是我的 ID - 从而使每个人的头像都出现,而不仅仅是我的(或当前用户的任何人)。
感谢您的帮助!
编辑:
func getParticipantInfo() {
let groupRef = databaseRef.child("groups").child(currentRoomIdGlobal)
groupRef.observe(.childAdded, with: { snapshot in
if let snapDict = snapshot.value as? [String : AnyObject] {
for each in snapDict {
let uid = each.key
let avatar = each.value["profilePicture"] as! String
let gender = each.value["gender"] as! String
let handle = each.value["handle"] as! String
let name = each.value["name"] as! String
let status = each.value["status"] as! String
// Set those to the dictionaries [UID : value]
self.avatarDictionary.setValue(avatar, forKey: uid)
self.nameDictionary.setValue(name, forKey: uid)
self.genderDictionary.setValue(gender, forKey: uid)
self.handleDictionary.setValue(handle, forKey: uid)
self.statusDictionary.setValue(status, forKey: uid)
DispatchQueue.main.async {
self.createAvatar(senderId: uid, senderDisplayName: name, photoUrl: avatar, color: UIColor.lightGray)
self.navCollectionView?.collectionView?.reloadData()
}
}
}
})
}
创建头像:
func createAvatar(senderId: String, senderDisplayName: String, photoUrl: String, color: UIColor) {
if self.avatars[senderId] == nil {
let img = MyImageCache.sharedCache.object(forKey: senderId as AnyObject) as? UIImage
if img != nil {
self.avatars[senderId] = JSQMessagesAvatarImageFactory.avatarImage(with: img, diameter: 30)
} else if photoUrl != "" {
// the images are very small, so the following methods work just fine, no need for Alamofire here
if photoUrl.contains("https://firebasestorage.googleapis.com") {
self.storage.reference(forURL: photoUrl).data(withMaxSize: 1 * 1024 * 1024) { (data, error) -> Void in
if (error != nil) {
assertionFailure("Error with Firebase Storage")
}
else {
let newImage = UIImage(data: data!)
self.avatars[senderId] = JSQMessagesAvatarImageFactory.avatarImage(with: newImage, diameter: 30)
MyImageCache.sharedCache.setObject(newImage!, forKey: senderId as AnyObject, cost: data!.count)
}
}
} else if let data = NSData(contentsOf: NSURL(string:photoUrl)! as URL) {
let newImage = UIImage(data: data as Data)!
self.avatars[senderId] = JSQMessagesAvatarImageFactory.avatarImage(with: newImage, diameter: 30)
MyImageCache.sharedCache.setObject(newImage, forKey: senderId as AnyObject, cost: data.length)
} else {
// Initials
let senderName = nameDictionary.value(forKey: senderId) as! String
let initials = senderName.components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.characters.first!)") + "\($1.characters.first!)" }
let placeholder = JSQMessagesAvatarImageFactory.avatarImage(withUserInitials: initials, backgroundColor: UIColor.gray, textColor: UIColor.white, font: UIFont.systemFont(ofSize: 14), diameter: UInt(kJSQMessagesCollectionViewAvatarSizeDefault))
MyImageCache.sharedCache.setObject(placeholder!, forKey: senderId as AnyObject)
}
}
} else {
// Initials
let senderName = nameDictionary.value(forKey: senderId) as! String
let initials = senderName.components(separatedBy: " ").reduce("") { ($0 == "" ? "" : "\($0.characters.first!)") + "\($1.characters.first!)" }
let placeholder = JSQMessagesAvatarImageFactory.avatarImage(withUserInitials: initials, backgroundColor: UIColor.gray, textColor: UIColor.white, font: UIFont.systemFont(ofSize: 14), diameter: UInt(kJSQMessagesCollectionViewAvatarSizeDefault))
MyImageCache.sharedCache.setObject(placeholder!, forKey: senderId as AnyObject)
}
}
最佳答案
据我所知,JSQMessage中包含发送者的senderId,所以下面的函数已经指定了要返回什么头像:
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
let message = messages[indexPath.row]
return avatars[message.senderId]
}
您需要添加头像
var avatars = [String: JSQMessagesAvatarImage]()
我假设您拥有该用户的用户 ID,因此每次有人加入对话时都以相同的方式获取头像。让我们说 userToChatWith:
createAvatar(userToChatWith.userKey, senderDisplayName: userToChatWithName, user: userToChatWith, color: UIColor.lightGray)
关于ios - JSQMessagesViewController:如何在 viewDidLoad 中获取 senderId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44057085/
我正在使用 c2dm 处理消息传递应用程序。我在 c2dm 上注册了我的应用程序。但是当我向使用我的应用程序的任何特定 id 发送消息时,收到错误提示“发件人 ID 不匹配”。会是什么?谁能帮帮我?
我目前正在使用 JSQMessageViewController 开展一个项目和收到错误 required method not Implemented: -[JSQMessagesViewContr
我正在尝试将 GCM 与 Titanium Studio 结合使用,并且我希望能够在我的 Android 应用程序中实现推送通知:我正在使用下面的代码: var CloudPush = require
当我尝试执行 Update-Database 时,出现此错误: The navigation property 'SenderId' is not a declared property on typ
尝试设置适用于 iOS 的 Firebase 时,我在控制台中收到此错误: Firebase messaging not setup correctly, nil senderID. 看来 Fire
几个月前,我从 Google API 控制台激活了我的 GCM,并在我的 Android 项目中实现了它,一切正常。我能够使用我的服务器 API key 注册、获取 regId 并从我的服务器发送通知
我有一个在 viewDidLoad 中调用的头像函数(如果它有帮助,这就是函数,尽管我认为问题不在于函数本身:https://pastebin.com/ksHmucTX)。 在 viewDidLoad
我正在使用 jSPF验证 SPF传入电子邮件地址的记录。 现在我需要支持 Sender-ID也是。 是否可以使用与 jSPF 相同的代码或一些补丁我可以用它来验证 Sender-ID也是吗? 我检查了
我已经阅读了文档并观看了视频,但这仍然让我感到困惑。 我在我的 Android 应用程序中使用了 PRODUCT_ID 并将其发送到 Google Cloud Messaging (GCM),以便它返
我已经在我的应用程序中实现了 GCM(谷歌云消息传递)。 Google Play 服务库自动生成了 values.xml,其中我的 senderId 是: 123 问题是我有其他语言环境
我正在尝试使用 AWS 开发工具包通过我的 PHP 网站发送短信。我使用来自 Sending SMS with Amazon AWS services PHP 的代码. require $_SERVE
出于某种原因,SenderID 似乎恢复为 NOTICE - 请参阅此处 当我在代码中设置 SenderID 时。 当我将 SenderID 变量排除在外时,它将作为默认集发送 - 这很好,但我们偶尔
我正在玩 JSQMessagesViewController。我使用 Raywenderlich 的 Firebase Tutorial: Real-time Chat tutorial. 完成的第一
自过去两个月以来,我一直在使用 aws sns 向印度电话号码发送短信。我正在使用 PHP SDK 进行 api 调用。 我已经发送了 7000 多条与我们公司名称相关的自定义 senderid 的成
我是一名优秀的程序员,十分优秀!