2017-05-18 5 views
0

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) 
    } 
} 

Antwort

1

Soweit ich weiß, das JSQMessage die SenderID des Absenders enthält, so dass die Funktion unten bereits gibt an, welche Avatar zurückgegeben werden:

Sie müssen

einen Avatar hinzufügen

Ich nehme an, Sie haben die userId dieses Benutzers, also erhalten Sie den Avatar auf die gleiche Weise jedes Mal, wenn jemand der Konversation beitritt. Sagen wir UserToChatWith:

createAvatar(userToChatWith.userKey, senderDisplayName: userToChatWithName, user: userToChatWith, color: UIColor.lightGray) 
+0

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

+0

Wenn jeder Benutzer eine "eindeutige ID" hat und Sie diese ID in viewDidLoad haben, dann rufen Sie für jede ID –

+0

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"? –

Verwandte Themen