Ios 未显示将数据推送到UITableView的操作

Ios 未显示将数据推送到UITableView的操作,ios,arrays,swift,tableview,Ios,Arrays,Swift,Tableview,我正在尝试将数据从UIViewController推送到UITableView。现在我可以将一段数据推送到单元格中,它看起来很好。我遇到的问题是,如果我返回并推送更多数据,它只会覆盖单元格。而不是去另一个牢房。我已经试过这个建议了 和self.tableView.reloadData()。这似乎并没有解决我所面临的问题。下面是我编写的代码 class PredictorTableViewController: UITableViewController { var predictorTr

我正在尝试将数据从UIViewController推送到UITableView。现在我可以将一段数据推送到单元格中,它看起来很好。我遇到的问题是,如果我返回并推送更多数据,它只会覆盖单元格。而不是去另一个牢房。我已经试过这个建议了 和
self.tableView.reloadData()
。这似乎并没有解决我所面临的问题。下面是我编写的代码

class PredictorTableViewController: UITableViewController {
    var predictorTrack = ""
    var firstDriver = ""
    var secondDriver = ""
    var thirdDriver = ""

    var grandPrix = [GrandPrix]()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.grandPrix.append(GrandPrix(granPrix: predictorTrack, firstDriver: firstDriver, secondDriver: secondDriver, thirdDriver: thirdDriver))
        self.tableView.reloadData()
        self.navigationItem.title = "Predictor"
        let backbutton = UIButton(type: .custom)
        backbutton.setTitle(" Back", for: .normal)
        backbutton.setTitleColor(.blue, for: .normal)
        backbutton.addTarget(self, action: #selector(self.backbuttonpressed), for: .touchUpInside)

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backbutton)
        setupNavBar()

    }

    @objc func backbuttonpressed() {
        dismiss(animated: true, completion: nil)
    }

    func setupNavBar(){
        navigationController?.navigationBar.prefersLargeTitles = true
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return grandPrix.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! GrandPrixTableViewCell
        let race = self.grandPrix[indexPath.row]
        // Configure the cell...
        cell.grandPrix.text = race.grandPrix
        cell.firstPostion.text = race.firstDriver
        cell.secondPosition.text = race.secondDriver
        cell.thirdPostion.text = race.thirdDriver

        return cell
    }
下面是准备segue的功能

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController
        vc.predictorTrack = TrackTextField.text!
        vc.firstDriver = firstTextField.text!
        vc.secondDriver = secondTextField.text!
        vc.thirdDriver = thirdTextField.text!
    }
}

您的问题是,每当您返回到上一个
uiviewcontroller
实例时,
predictableviewcontroller
就会从内存中删除,因此与它相关的所有数据也会消失(
grandPrix
array)

我可以向您推荐3种解决方案:
首先

将您的
grandPrix
数组保存在父级
UIViewController
中,并在执行segue时将其传递到
predictableviewcontroller

var grandPrix = [GrandPrix]()

...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController

        // append new GrandPrix to local array
        self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!)) 

        // important part: pass local data to destination
        vc.grandPrix = self.grandPrix    
    }
}

predictableviewcontroller
作为父级
UIViewCointroller
中的强引用,并在需要时手动将
predictableviewcontroller
推送到
UINavigationController

// Strong lazy reference
lazy var predicatorController: PredicatorTableViewController = {

    // If needed, this can be loaded from a NIB or Storyboard
    return PredicatorTableViewController()
}()
要使用此调用,请执行以下
UINavigationController
函数:

// generate new data for predicatorController and append it to grandPrix array
predicatorController.grandPrix.append(...)

// show predicatorController
self.navigationController?.pushViewController(predicatorController, animated: true)
有此解决方案的p.S.不使用分段


第三

与第一个建议相同,但
grandPrix
数组的数据将存储在本地缓存中(例如CoreData数据库)。您必须编写本地缓存数据检索/存储函数,并在需要访问现有对象和将新GrandPrix对象存储到本地缓存时相应地使用它



祝您好运:)

您是否尝试将didSet设置为您在stackoverflow问题链接中提到的grandPrix变量?试试这个变量grandPrix=[grandPrix](){didSet{self.tableView.reloadData()}。你说你要回去,你要回去哪里?您是否关闭了ViewController?那么您的数据模型可能只有一个元素。需要更多关于GrandPrix以及如何填充[GrandPrix]()数组的说明。我已经尝试过Imrul,但它仍然覆盖单元格。所以只显示一段数据。您是否检查了当您返回时,[GrandPrix]()数组有多少元素?它只显示以下
[Racing_Weather.GrandPrix][Racing_Weather.GrandPrix][Racing_Weather.GrandPrix][Racing_Weather.GrandPrix]
可能您的数组没有存储以前的数据,当您关闭VC时,您的数组将变为空。当您关闭PredictorTableViewController时,在调试部分使用po命令查看var grandPrix是否为空。谢谢您,Tomas,这对您帮助很大。