Ich habe eine Funktion für Avatare, die in viewDidLoad
aufgerufen wird (das ist die Funktion, wenn es hilft, obwohl ich denke, das Problem ist nicht die Funktion selbst: https://pastebin.com/ksHmucTX).JSQMessagesViewController: Wie bekomme ich senderId in viewDidLoad?
In viewDidLoad
Ich nenne es:
createAvatar(senderId: self.senderId, senderDisplayName: self.senderDisplayName, user: self.currentUser!, color: UIColor.lightGray)
Aber da ich nur vorbei in meine Informationen (wie der aktuelle Benutzer), wenn die app ich nur mein Avatar sehen und nicht die Avatare von allen anderen in der Chat.
In der avatarImageDataForItemAt
Funktion gibt es einen Indexpfad die Nachricht, um herauszufinden, ist die:
override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! {
let message = messages[indexPath.row]
return avatars[message.senderId]
}
Also ich frage mich, wie man die richtige senderId
(eine Nachricht gesendet, dh die ID wer auch immer) erhalten in viewDidLoad, so kann ich es in den createAvatars
Aufruf, im Gegensatz zu dem, was ich jetzt habe, wo senderId
ist nur meine ID - damit jedermanns Avatar erscheinen, und nicht nur mir (oder wer auch immer der aktuelle Benutzer).
Danke für jede Hilfe!
EDIT:
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()
}
}
}
})
}
createAvatar:
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)
}
}
Jeder Benutzer in der App hat eine eindeutige ID. Aber ich denke, wo ich verwirrt bin, ist, wie man "userToChatWith" in viewDidLoad bekommt, wenn ich 'createAvatar' anrufe. – KingTim
Wenn jeder Benutzer eine "eindeutige ID" hat und Sie diese ID in viewDidLoad haben, dann rufen Sie für jede ID –
createAvatar (uniqueId, senderDisplayName: nameOfThatUniqueId, user: userToChatWith, color: UIColor.lightGray). Ich benutze eine Struktur für Benutzer, aber da Sie mit currentUser arbeiten, vermute ich, dass Sie das gleiche tun? Wenn Ihr aktueller Benutzer ein anderes Format hat, legen Sie jeden Benutzer in diesem Format ab. Die Idee ist, dass du die "unique id", den Benutzernamen und die pictureURL benötigst, um das Image des Servers zu erhalten, also ändere vielleicht den "user: userToChatWith" zu "imageUrl: pictureURL"? –