Firebase 聊天用户正在输入指示单元格

Posted

技术标签:

【中文标题】Firebase 聊天用户正在输入指示单元格【英文标题】:Firebase Chat user is typing indicator cell 【发布时间】:2018-10-30 19:46:53 【问题描述】:

我有一个 Firebase 实时数据库,允许用户相互发送直接消息,如下所示:

chats
-- fromUserID
---- toUserID
---- newMessages: Bool
---- isTyping: Bool
---- messageID_1
------ messageTimeStamp
---- messageID_2
------ messageTimeStamp
---- messageID_3
------ messageTimeStamp

messages
-- messageID
---- messageFromID
---- messageToID
---- messageText
---- messageTimeStamp
---- messageRead

如您所见,我在每个聊天的聊天中都存储了一个密钥,它是一个布尔值,用于指示用户是否正在打字。我在 textFieldDidChange 中将其更改为 true (如果 textView.text != nil 并且 isSending = false,只是为了限制请求)。我将计时器设置为 10 秒以自动将“isTyping”值恢复为 false,以防用户关闭应用程序或其他情况。

func textViewDidChange(_ textView: UITextView) 

    if(!isSending && textView.text != nil) 

        isSending = true

        if let messagePartner = messagePartner 

            Ref.child("chats").child(messagePartner).child(loggedInUserID).updateChildValues(["isTyping": true])

        

    

    if(isSending && textView.text == nil) 

        if let messagePartner = messagePartner 

            Ref.child("chats").child(messagePartner).child(loggedInUserID).updateChildValues(["isTyping": false])

        
    



func observeTyping() 

    if let messagePartner = messagePartner 

        typingObserver = Ref.child("chats").child(loggedInUserID).child(messagePartner).observe(.childChanged)  (snapTyping) in

            if(snapTyping.key == "isTyping") 

                let isTypingValue = snapTyping.value as? Bool

                if(isTypingValue == true) 

                    self.isTyping = true

                    if let messagePartnerFirstName = self.messagePartnerFirstName, let messagePartnerLastName = self.messagePartnerLastName 

                        self.navigationItem.title = messagePartnerFirstName + " " + messagePartnerLastName + " is typing..."

                    

                 else 

                    self.isTyping = false
                    self.typingTimer?.invalidate()

                    if let messagePartnerFirstName = self.messagePartnerFirstName, let messagePartnerLastName = self.messagePartnerLastName 

                        self.navigationItem.title = messagePartnerFirstName + " " + messagePartnerLastName

                    

                

            

        

    


目前,当 isTyping 为 true 时,我将 navigationItem.title 更改为“用户名正在键入...”,或者当 isTyping 为 false 时将其更改为“用户名”。这就像一个魅力。

这非常简单易懂。但是,我想更改行为以显示正在输入的用户单元格,其中只有“...”,有点像 ios Messenger 和 Facebook Messenger。然而,我有几个关于如何实现这一点的问题。

首先:我从messages.count 返回collectionView 中的单元格数。我应该在用户输入时将消息附加到 messages.count 吗?

其次,一旦用户停止输入或计时器触发(10 秒后),我想删除此单元格。我应该如何在正确的 indexPath 上执行此操作?我可以保存显示单元格的 indexPath,然后将其删除吗?

第三个也是最后一个:我希望这个单元格始终位于聊天的底部。因此,当其他用户输入消息时,... 指示符仍应位于底部。我也能做到吗?

任何可以为我指明正确方向的想法或提示将不胜感激!谢谢各位。

编辑: 回顾我的帖子,我现在正在考虑另一种方式:引入另一个自定义 UICollectionViewCell 是否是个好主意,它基于聊天单元,但里面只有 ...并根据 isTyping 更改 numberOfItemsInSection?像这样的:

if(isTyping) 
    return messages.count + 1
 else 
    return messages.count

我只是在大声思考 - 请让我知道你们的想法或者是否有更好的解决方案。

【问题讨论】:

【参考方案1】:

最终用补充视图(页脚)修复它,我根据 Bool isTyping 更改高度(如果不输入,将框架设置为宽度和高度 0)并相应地更改 contentInset。然后当 Fitebase 观察者中的 isTyping 更改时,我 reloadData() 以显示或隐藏页脚,效果很好!

【讨论】:

以上是关于Firebase 聊天用户正在输入指示单元格的主要内容,如果未能解决你的问题,请参考以下文章

在表格视图单元格中显示活动指示器

Firebase和填充单元格的“索引超出范围”

点击时更新 tableView 单元格中的 Firebase 数据

Excel 不会将单元格视为空白

删除 tableView 单元格并从 firebase 中删除数据

TableView 交互阻止单元格中的动画