2016-12-02 11 views
0

私は受信者の送信者名を表示しています。しかし、私は人が送信するすべてのテキストに名前を表示したくありません。たとえば、彼/彼女がメッセージを連続して送信する場合、最初のメッセージの上に名前を表示するだけです。私はここに私のチャットのスクリーンショットを提供します:つまりSwift JSQMessagesViewControllerの名前の先頭に

screenshot of my chat

を、私はちょうどそれが彼/彼女が送信非常に「最初の」のメッセージにユーザーの名前を表示したいです。私はattributedTextForMessageBubbleTopLabelAtで運がないこの問題を解決しようとしました。

前のメッセージの送信者IDが以前の送信者IDと等しいかどうかを確認しようとしましたが、表示可能かどうかは何とか分かります。しかし、これにより、オプションのエラー、範囲外のインデックス、および単純に動作するソリューションでは、多くの、多くの試みが失敗しました。

これは私が今持っているコードです:これは、あなたが最初にそれを見たときに解決するために、最初は難しい問題である

let message = messages[indexPath.item] 

    switch message.senderId { 

    case FIRAuth.auth()!.currentUser!.uid: 
     return nil 
     break 

    default: 

     guard let senderDisplayName = message.senderDisplayName else { 
      assertionFailure() 
      return nil 
     } 

     let paragraphStyle = NSMutableParagraphStyle() 
     paragraphStyle.alignment = NSTextAlignment.left 

     let attributedString = NSAttributedString(string: message.senderDisplayName, 
                attributes: [ 
                NSParagraphStyleAttributeName: paragraphStyle, 
                NSBaselineOffsetAttributeName: NSNumber(value: 0) 
      ]) 

     return attributedString 
     break 

    } 

答えて

0

。私たちがする必要があるのは、メッセージが一連のメッセージの中の最初のメッセージかどうかを判断することです。だから私は、その人が最初に送信したメッセージであるかどうかを判断する関数を作成しました。

private func firstMessageInSet(indexOfMessage: IndexPath) -> Bool { 
    return messages[safe: indexOfMessage.item - 1]?.senderId() == messages[safe: indexOfMessage.item]?.senderId() 
} 

それは単にそれが現在のメッセージと同じであるかどうかを確認するために透過性メッセージのsenderIdをチェックします。

は、それからちょうどこの方法ではその男を呼び出す:

override func collectionView(_ collectionView: JSQMessagesCollectionView!, attributedTextForMessageBubbleTopLabelAt indexPath: IndexPath!) -> NSAttributedString! { 
    guard let message = messages[safe: indexPath.item] else { return nil } 
    return firstMessageInSet(indexOfMessage: indexPath) ? nil : NSAttributedString(string: message.senderDisplayName) 
} 

これは、セット内の最初のかどうかを確認し、それがある場合senderDisplayNameを返します。さて、これは短い手を使っているが、最終的にそれはあなたの事

+0

こんにちはダニエルと幸運を助けること希望

if firstMessageInSet(indexOfMessage: indexPath) { return NSAttributedString(string: message.senderDisplayName) } else { return nil } 

と同じです!まず、お手伝いをしてくれてありがとう、ありがとう。残念ながら、私は奇妙なエラーに遭遇しました。あなたが知っているように、あなたのコードは実際に働いていて、私が最後に得た「範囲外のインデックス」エラーを私に与えませんでした。問題は今、「最初のメッセージ」に名前が表示されないということです。それは2番目にのみ表示されます。私は 'firstMessageInSet'関数で演奏しようとしましたが、運がありません。なぜこれが起こるか知っていますか?私はとても近いです! – askaale

+0

3つのメッセージを連続して送信してみます。 2番目と3番目のメッセージに送信者の表示名がある場合は、そのメソッドのロジックを入れ替えた可能性があります。 –

+0

これは 'return firstMessageInSet(indexOfMessage:indexPath)ですか?なぜなら、私はスイッチ(message.senderId)を使用して、コードをデフォルトに置くからです。つまり、このコードはデフォルトで使用されています。つまり、NSAttributedString(string:message.senderDisplayName):nil } '悪い答えを返す –

関連する問題