Ios XCode中的tableView正在从数组返回包含随机数据的单元格

Ios XCode中的tableView正在从数组返回包含随机数据的单元格,ios,swift,xcode,swift3,tableview,Ios,Swift,Xcode,Swift3,Tableview,我正在用xcode制作一个简单的消息传递应用程序。表格视图由包含右视图和左视图的自定义单元格填充。当用户收到消息时,填充左视图,当用户发送消息时,填充右视图 问题是在重新加载tableView之后,有时我会看到单元格中充满了来自包含消息的数组的加扰数据。我不知道发生了什么事 我尝试过的事情: 我已经检查了Back4App中存储在我后端的消息文件,它们都包含相应的csv数据 我看了看我的细胞计数,它总是准确的 我已经在表重新加载之前和之后打印了数组和单元格数据,数组中的数据都是正确的 如果我离开

我正在用xcode制作一个简单的消息传递应用程序。表格视图由包含右视图和左视图的自定义单元格填充。当用户收到消息时,填充左视图,当用户发送消息时,填充右视图

问题是在重新加载tableView之后,有时我会看到单元格中充满了来自包含消息的数组的加扰数据。我不知道发生了什么事

我尝试过的事情:

  • 我已经检查了Back4App中存储在我后端的消息文件,它们都包含相应的csv数据
  • 我看了看我的细胞计数,它总是准确的
  • 我已经在表重新加载之前和之后打印了数组和单元格数据,数组中的数据都是正确的
  • 如果我离开消息VC并返回到它,所有消息都会正确显示,但当我留在VC中并使用“发送”按钮发送消息时,数据会有点混乱,并打印出我的tableView的奇怪组合
您可以看到底线显示不正确:

这是我的聊天室:

//
//  ChatViewController.swift
//  Glam
//
//  Created by Student on 11/14/20.
//  Copyright © 2020 Tucker Weibell. All rights reserved.
//

import UIKit
import Parse

class ChatViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var tableView: UITableView!
    @IBOutlet weak var navTitle: UINavigationItem!
    var senders = [String]()
    var message = [String]()
    var state = [String]()
    @IBOutlet weak var textView: UITextView!
    @IBOutlet weak var myView: UIView!
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
    
    var dataStringSender = ""
    var dataStringReciever = ""
    var senderName = ""
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        getData()
        navTitle.title = MessageCustomerViewController.GlobalVars.selectedItem
        
        
        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotification), name: UIResponder.keyboardWillShowNotification, object: nil)
        
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
        self.view.addGestureRecognizer(tap)
    }
    
    func getData() {
        let user = PFUser.current()
        let username = user?.username
        senderName = username!
        let query = PFUser.query()
        query?.whereKey("username", equalTo: username!)
        do {
            let result = try query?.findObjects()
            let file = result![0]["Messages"] as! PFFileObject
            do {
                let data = try file.getData()
                let string = String(decoding: data, as: UTF8.self)
                dataStringSender = string
                let cvsRows = string.components(separatedBy: "\n")
                for row in cvsRows {
                    var itemsRow = row.components(separatedBy: ",")
                    print(itemsRow)
                    itemsRow[2] = itemsRow[2].replacingOccurrences(of: "\r", with: "")
                    print(itemsRow)
                    if itemsRow[0] == MessageCustomerViewController.GlobalVars.selectedItem {
                        senders.append(itemsRow[0])
                        message.append(itemsRow[1])
                        state.append(itemsRow[2])
                    }
                }
            }
            catch {
                print(error.localizedDescription)
            }
            
        }
        catch {
            print(error.localizedDescription)
        }
        
        loadData()
    }
    
    
    @IBAction func sendMessage(_ sender: Any) {
        
        let query = PFUser.query()
        query?.whereKey("username", equalTo: MessageCustomerViewController.GlobalVars.selectedItem)
        do {
            let result = try query?.findObjects()
            if result?[0]["Messages"] != nil {
                let file = result![0]["Messages"] as! PFFileObject
                do {
                    let data = try file.getData()
                    let string = String(decoding: data, as: UTF8.self)
                    dataStringReciever = string
                }
                catch {
                    print(error)
                }
            }
            
        }
        catch {
            print(error)
        }
        
        dataStringSender = dataStringSender + "\n" + MessageCustomerViewController.GlobalVars.selectedItem + "," + textView.text + "," + "Sent"
        dataStringReciever = dataStringReciever + "\n" + senderName + "," + textView.text + "," + "Recieved"
        
        let dataSent = Data(dataStringSender.utf8)
        let dataRecieved = Data(dataStringReciever.utf8)
        //let fileSent: PFFileObject = PFFileObject(data: dataSent)!
        //let fileRecieved: PFFileObject = PFFileObject(data: dataRecieved)!
        
        
        let fileSent = PFFileObject(name: "message.csv", data: dataSent)
        
        let fileRecieved = PFFileObject(name: "message.csv", data: dataRecieved)
        
        let user = PFUser.current()
        user!["Messages"] = fileSent
        user?.saveInBackground()
        
        let newQuery = PFUser.query()
        newQuery?.whereKey("username", equalTo: MessageCustomerViewController.GlobalVars.selectedItem)
        do {
            let newResults = try newQuery?.findObjects()
            newResults![0]["Messages"] = fileRecieved
            newResults![0].saveInBackground()
        }
        catch {
            print(error)
        }
        clearData()
        getData()
        print("\n")
        print("\n")
        print(message)
        print("\n")
        print("\n")
        print(state)
        loadData()
        
    }
    
    func loadData() {
        self.tableView.reloadData()
    }
    
    func clearData() {
        message.removeAll()
        state.removeAll()
        senders.removeAll()
    }
    
    
    @objc func handleKeyboardNotification(notification: NSNotification) {
        if let keyboardFrame: NSValue = notification.userInfo![UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardRectangle = keyboardFrame.cgRectValue
            var height = keyboardRectangle.height
            height = height * -1
            bottomConstraint.constant = height + 85
        }
        
    }
    
    @objc func dismissKeyboard(sender: UITapGestureRecognizer) {
        bottomConstraint.constant = 0
        textView.resignFirstResponder()
    }
    
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return message.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
            print([message[indexPath.row]])
    
            let cell = tableView.dequeueReusableCell(withIdentifier: "messagescell") as! MessagesCell
        
            if state[indexPath.row] == "Sent" {
                cell.sentText.text = message[indexPath.row]
                cell.sentView.backgroundColor = .clear
            }
            else {
                cell.recievedText.text = message[indexPath.row]
                cell.recievedView.backgroundColor = .clear
        }
        return cell
    }


}

这听起来很像是一个可重用单元的问题

因为您在这里重复使用您的单元格
let cell=tableView.dequeueReusableCell(带有标识符:“messagescell”)as!MessagesCell
如果没有显式地为所有单元格设置新值,则这些单元格的属性偶尔会出现旧状态


您应该在自定义单元格实现中重写
prepareForReuse()
,并将单元格重置为默认值。

您可以通过在CellForRow中设置断点来进行调试,该断点位于XPath:单元格文本的修改方式。对于发送,您可以清除ReceivedText;对于接收,您可以通过设置空字符串来清除sentText。