首页 > 解决方案 > XCode 中的 tableView 正在返回包含来自数组的随机数据的单元格

问题描述

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

问题是在重新加载 tableView 后,有时我会看到单元格中填充了来自包含消息的数组的乱码数据。我不确定发生了什么。

我尝试过的事情:

您可以看到底线未正确显示: 显示错误的图像

这是我的聊天VC:

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


}

标签: iosswiftxcodeswift3tableview

解决方案


这听起来很像可重复使用的细胞问题。

由于您在此处重用单元格let cell = tableView.dequeueReusableCell(withIdentifier: "messagescell") as! MessagesCell,因此如果您没有为所有单元格显式设置新值,这些单元格的属性会不时地具有旧状态。

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


推荐阅读