Closed KheangSenghort closed 5 years ago
When server provide api not base on Sender & Receiver: I try to use field fromUser to customize outgoingMessage & incomingMessage but it not work. Everyone can help me to correct code.
import UIKit import JSQMessagesViewController
class Message: JSQMessage { var fromUser: String?
init!(senderId: String!, senderDisplayName: String!, date: Date!, text: String!, fromUser: String!) { self.fromUser = fromUser super.init(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}
class ChatViewController: JSQMessagesViewController {
lazy var outgoingBubble: JSQMessagesBubbleImage = { return JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleBlue()) }() lazy var incomingBubble: JSQMessagesBubbleImage = { return JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray()) }() var messages = [Message]() var userName = "" var fromUser = "" var user = "" override func viewDidLoad() { super.viewDidLoad() self.fromUser = "1" for i in 1...115{ user = (i%2 == 0) ? "2" : self.fromUser let message = Message(senderId: "Enior", senderDisplayName: "John Alex", date: Date(), text: "Hello! I am here to help you", fromUser: user) self.messages.append(message!) } inputToolbar.contentView.leftBarButtonItem = nil collectionView.collectionViewLayout.incomingAvatarViewSize = .zero collectionView.collectionViewLayout.outgoingAvatarViewSize = .zero collectionView?.collectionViewLayout.springinessEnabled = false automaticallyScrollsToMostRecentMessage = true self.collectionView?.reloadData() self.collectionView?.layoutIfNeeded() } // Override method override var senderDisplayName:String! { get{ return self.userName } set{ //do nothing } } override var senderId:String! { get{ return self.fromUser } set{ //do nothing } } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return messages.count } override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! { return messages[indexPath.item] } override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! { return messages[indexPath.item].fromUser == senderId ? outgoingBubble: incomingBubble } override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath!) -> JSQMessageAvatarImageDataSource! { return nil } override func collectionView(_ collectionView: JSQMessagesCollectionView, attributedTextForCellTopLabelAt indexPath: IndexPath) -> NSAttributedString? { if (indexPath.item % 3 == 0) { let message = self.messages[indexPath.item] return JSQMessagesTimestampFormatter.shared().attributedTimestamp(for: message.date) } return nil } override func collectionView(_ collectionView: JSQMessagesCollectionView, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath) -> NSAttributedString? { let message = messages[indexPath.item] if message.fromUser == self.senderId { return nil } return NSAttributedString(string: message.senderDisplayName) } override func collectionView(_ collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForCellTopLabelAt indexPath: IndexPath) -> CGFloat { if indexPath.item % 7 == 0 { return kJSQMessagesCollectionViewCellLabelHeightDefault } return 0.0 } override func collectionView(_ collectionView: JSQMessagesCollectionView, layout collectionViewLayout: JSQMessagesCollectionViewFlowLayout, heightForMessageBubbleTopLabelAt indexPath: IndexPath) -> CGFloat { let currentMessage = self.messages[indexPath.item] if currentMessage.fromUser == self.senderId { return 0.0 } if indexPath.item - 1 > 0 { let previousMessage = self.messages[indexPath.item - 1] if previousMessage.fromUser == currentMessage.fromUser { return 0.0 } } return kJSQMessagesCollectionViewCellLabelHeightDefault; }
When server provide api not base on Sender & Receiver: I try to use field fromUser to customize outgoingMessage & incomingMessage but it not work. Everyone can help me to correct code.
import UIKit import JSQMessagesViewController
class Message: JSQMessage { var fromUser: String?
}
class ChatViewController: JSQMessagesViewController {
}