2017-01-03 10 views
0

私はチャットメッセージをシミュレートしようとしています。いくつかの新しいセルを挿入した後、最も古いものがいくつか消えてしまいます。そして、スクロールが再び現れ、消えたら。私はここから私が見つけたすべての解決策を試しましたが、何も動作せず、エラーが起こる場所はあまりありません。空白のセルが表示され、UITableViewで無作為に消えます。

私はあなたに手伝ってもらうべきなのかどうか分かりません。私は自分のTableViewコードを投稿して、何か間違ったことをしているか、何か必要があれば教えてください。

func getMessageCell(withDisplayedMessage displayedMessage: GroupChatMessages.GetChatMessages.displayedChatMessage) -> GroupChatCell { 

    switch displayedMessage.messageType { 
    case 0: 
     if displayedMessage.sender == self.currentUser.userID { 
      let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("senderCell") as! GroupChatCell 

      dispatch_async(dispatch_get_main_queue()) { 
       cell.configureCellText(withText: displayedMessage.text, andUtcSendTime: displayedMessage.utcSendTime) 
       cell.selectionStyle = UITableViewCellSelectionStyle.None 
      } 
      return cell 
     } 

     let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("receiverCell") as! GroupChatCell 
     cell.configureCellAttributted(withText: displayedMessage.text, andSenderName: displayedMessage.senderName, andUtcSendTime: displayedMessage.utcSendTime) 
     cell.selectionStyle = UITableViewCellSelectionStyle.None 
     return cell 

    case 1: 
     let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("announcementCell") as! GroupChatCell 

     dispatch_async(dispatch_get_main_queue()) { 
      cell.configureInformationCell(withText: displayedMessage.text) 
      cell.selectionStyle = UITableViewCellSelectionStyle.None 
     } 

     return cell 
    case 2: 
     if displayedMessage.sender == self.currentUser.userID { 
      let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("senderImageCell") as! GroupChatCell 

      dispatch_async(dispatch_get_main_queue()) { 
       cell.configureSenderImageCell(withImageUrl: displayedMessage.text, andUtcSendTime: displayedMessage.utcSendTime) 
       cell.selectionStyle = UITableViewCellSelectionStyle.None 
      } 

      return cell 
     } 

     let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("receiverImageCell") as! GroupChatCell 

     dispatch_async(dispatch_get_main_queue()) { 
      cell.configureImageCell(withImageUrl: displayedMessage.text, andSenderName: displayedMessage.senderName, andUtcSendTime: displayedMessage.utcSendTime) 
      cell.selectionStyle = UITableViewCellSelectionStyle.None 
     } 
     return cell 

    case 10: //SpecialCaseForSendingImages 
     let cell = self.messagesTableView.dequeueReusableCellWithIdentifier("senderImageCell") as! GroupChatCell 

     dispatch_async(dispatch_get_main_queue()) { 
      cell.configureSenderImageCell(withImageUrl: displayedMessage.text, andUtcSendTime: displayedMessage.utcSendTime) 
      cell.selectionStyle = UITableViewCellSelectionStyle.None 
     } 

     return cell 
    default: 
     return GroupChatCell() 
    } 

はあなたが役立つことを願って、そしてそれ以上の情報は、私はできるだけ早く私はできるを提供します:私は毎回新しいメッセージが挿入された細胞を生成する方法

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.messagesCell.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     return self.messagesCell[indexPath.row] 
} 

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let message = self.messages[indexPath.row] 
    if message.messageType == 2 { 
     output.setImageUrl(message.text) 
     router.navigateToGroupChatMessagesScene() 
    } 
    else { 
     self.view.endEditing(true) 
    } 

} 

このコードはあります!どうもありがとうございます。

編集:私は、この機能でメッセージ情報を使用して新しい行を追加し、新たなメッセージが表示さ

func displayMessages(viewModel: GroupChatMessages.GetChatMessages.ViewModel) { 
    let displayedMessage = viewModel.displayedMessages 

    print ("i'm here!") 
    if let messages = displayedMessage { 

     self.messages = messages 
     self.messagesCell = [] 
     for index in 0..<messages.count { 
      let cell = self.getMessageCell(withDisplayedMessage: messages[index]) 
      self.messagesCell.append(cell) 

      let indexPath = NSIndexPath(forRow: index, inSection: 0) 
      self.messagesTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
     } 

     print ("i'm here2!") 

     firstTime = false 
//   self.scrollToLastMessage(false) 
     self.setVisible(hiddenTableView: false, hiddenChatLoader: true) 
     self.messagesLoaded = true 
    } 
} 
+0

どのように 'getMessageCell'を使用していますか?どこに呼び出すのですか –

+0

配列にメッセージオブジェクトだけを保存して、セルコードを 'cellForRow'に追加することはできません。複数のカスタムセルを使用するとかなり異なって見えます – Tj3n

+0

私は答えました私がなぜ細胞を持つ配列を使用したのかをJon Roseが見ていますが、私はそれを元に戻そうとします。 – Eironeia

答えて

0
  1. を取り除くをdispatch_asyncすでにメイン にする必要があります糸。
  2. Modelオブジェクトの配列をセルの配列にしないでください( の場合は displayedMessageの配列になるはずです)。
  3. また、これらのセルを再利用することができます( )ので、設定したプロパティは常に更新する必要があります。換言すれば、 の場合、セルを構成するときには、すべてifelseが必要です。

お役に立てば幸いです。

+0

こんにちは、ジョンのお返事ありがとうございます、私はそれを(dispatch_async)削除しますが、私はそれが非常に多くの時間がかかるので、私はテーブルビューで200以上のメッセージを持っているので、だから、私は多くの作業があるように私がスクロールするたびにgetMessageCellを行うのを避けるために、Cellの配列を実行しようとしたのです。私はそれの中で、そして中からリターンを使うので、私はelsのステートメントを使っているのと同じです。しかし、私は問題を抱えています。追加すると、残りの要素が現れて消えていったのです。 – Eironeia

+0

UITableviewには、他のセルがフレームに入ったときに再利用されるプールに入れられるときに、再利用するtableviewCellのプールがあります。これは非常に高速かつ効率的です。 200件のメッセージは、テーブルビューが対処するためのものではありません。あなたの 'getMessageCell'メソッドが何らかのラベルとイメージを設定するだけではなく、あなたは何か間違ったことをしています。 –

+0

Cellの配列を避けているようですが、今はスクロールに時間がかかるという問題があります。http://stackoverflow.com/questions/41422841/scroll-to-last-element-of-tableview-take-あまりにも多くの時間 – Eironeia

関連する問題