在UITableView

时间:2017-01-03 08:07:47

标签: ios swift xcode uitableview xcode7

我正在尝试模拟聊天消息,并在插入一些新的细胞后,一些最古老的消失。当我滚动再次出现并消失。我已经尝试了所有我从这里找到的解决方案,但没有任何作用,我也不太了解可能出现错误的蠢事。

我不确定我应该发布什么代码给你试图提供帮助,我会发布我的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
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 摆脱你应该已经在主要的dispatch_async 线。
  2. 保持一个Model对象数组不是一个单元格数组(in 你的情况看起来应该是一个数组 displayedMessage)。
  3. 还记得这些细胞可以重复使用, 因此,您设置的任何属性都必须始终更新。换一种说法 配置单元格时,每个if必须有else
  4. 希望有所帮助。