2017-01-03 168 views
0

隨機dissapear我試圖模擬一個聊天消息,並插入後一些新的細胞,一些最古老的dissapear的。當我滾動再次出現並消失。我已經嘗試了所有從這裏發現的解決方案,但沒有任何效果,我也沒有太多想法,可以在哪裏出錯。空白單元格出現在UITableView的

我不知道我應該張貼什麼代碼,你試圖幫助,我會發布我的TableView代碼,所以也許我做得不對,或者如果你需要什麼,只是讓我知道。

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 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 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

我回答了喬恩羅斯下面爲什麼我用單元格的數組,但我會盡量把它放回去。 – Eironeia

回答

0
  1. 擺脫dispatch_async您應該已經在主 線。
  2. 保留一個Model對象的數組不是一個單元格陣列(在 你的情況下它看起來應該是一個數組 displayedMessage)。
  3. 還記得,這些細胞可以重複使用, 讓你設置任何財產必須進行更新。換句話說,在配置單元時,每個if必須有else

希望有所幫助。

+0

嗨喬恩謝謝你的答案,我會刪除它(dispatch_async),但我有問題,當我滾動它需要太多的時間,因爲我有超過200消息在tableview,所以它需要太多的時間。所以這就是爲什麼我試圖做一個單元格數組,以避免每次滾動時都要執行getMessageCell,這似乎是很多工作。我在if和out中使用了return,所以就像我使用els語句。但是我遇到了這個問題,就在加入時,剩下的元素變得「瘋狂」出現並消失。 – Eironeia

+0

UITableview擁有一個tableviewCell池,它可以重用,當一個框架離開框架時,它將被放入一個池中,以便在另一個單元格進入框架時重用。這是非常快速和高效的。 200條消息對於tableview來說並不是很多。如果你的'getMessageCell'方法做的不僅僅是設置一些標籤和圖像,那麼你做錯了什麼。 –

+0

似乎避免了它的作品的數組,但現在我有滾動問題,需要太多時間,http://stackoverflow.com/questions/41422841/scroll-to-last-element-of-tableview-take-太多時間 – Eironeia

相關問題