JSQMessagesViewController – 发送带有附加图像文件的文本消息

我正在使用JSQMessagesViewController发送和接收消息。它适用于文本消息。 是否有可能使用JSQMessagesViewController框架发送文本消息与附加的图像文件。

点击时应该显示附加的图像文件。 像这样的东西。

消息窗口中应显示发送消息。

在这里输入图像说明

发送照片

- (void)addPhotoMediaMessage { JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"goldengate"]]; JSQMessage *photoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires displayName:kJSQDemoAvatarDisplayNameSquires media:photoItem]; [self.messages addObject:photoMessage]; } 

发送短信

 - (void)didPressSendButton:(UIButton *)button withMessageText:(NSString *)text senderId:(NSString *)senderId senderDisplayName:(NSString *)senderDisplayName date:(NSDate *)date { [JSQSystemSoundPlayer jsq_playMessageSentSound]; JSQMessage *message = [JSQMessage messageWithSenderId:senderId displayName:senderDisplayName text:text]; [self.messages addObject:message]; [self finishSendingMessageAnimated:YES]; [self receiveAutoMessage]; } 

要完成这个任务,你必须创build一个自定义单元格 ,然后在你的CollectionView中使用这个单元格

首先, 将JSQMessage子类化为如下内容以保存图像url(附件)的数据 –

 class ChatMessage: JSQMessage { internal var attachments : [NSURL]? init(senderId: String!, senderDisplayName: String!, date: NSDate!, text: String!, attachments: [NSURL]?) { self.attachments = attachments super.init(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text) } init(senderId: String!, senderDisplayName: String!, date: NSDate!, media: JSQMessageMediaData!) { super.init(senderId: senderId, senderDisplayName: senderDisplayName, date: date, media: media) } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 

现在你将不得不使用这个类来处理所有的聊天消息。

接下来,你将不得不为你的自定义单元格创build一个自定义的xib文件 。 在该xib中,您将为消息文本和附件图标添加标签和图像视图。

现在创build一个代表你自定义单元格 。 这将是如下的东西 –

 class CustomCell: UICollectionViewCell { @IBOutlet weak var topLabel: UILabel! @IBOutlet weak var bottomLabel: UILabel! @IBOutlet weak var containerView: UIView! @IBOutlet weak var dataLabel: UILabel! @IBOutlet weak var attachmentIcon: UIImage! override func awakeFromNib() { super.awakeFromNib() } } 

现在我们必须在JSQMessagesViewController子类中使用这个CustomCell。

viewDidLoad中用注册视图注册你的笔尖

 self.collectionView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellWithReuseIdentifier: "CustomCell") 

现在你可以最终使用你的自定义单元格 –

 override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let message = messages[indexPath.item] if message.attachments.count() != 0 { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("CustomCell", forIndexPath: indexPath) as! CustomCell cell.containerView.backgroundColor = UIColor.jsq_messageBubbleBlueColor() cell.containerView.layer.cornerRadius = 15 return cell } else { // Add code here for the normal cell } } 

这应该成功呈现您的自定义单元格。

最后,在点击自定义视图单元格后,您可以继续使用新的VC(不要忘记传递图像数据)并适当地显示图像。

不,不可能将两者都作为一条消息发送,但是可以将它们作为具有唯一定制标识符的两条消息发送,然后在您的应用程序中一起串联它们。希望帮助