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