передача данных в UITableView не отображается - PullRequest
0 голосов
/ 18 апреля 2019

Я пытаюсь отправить данные из 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
    }

Ниже приведена функция подготовки к переходу.

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

1 Ответ

1 голос
/ 19 апреля 2019

Ваша проблема в том, что всякий раз, когда вы возвращаетесь к предыдущему UIViewConntroller экземпляру PredictorTableViewController, он удаляется из памяти, поэтому все связанные с ним данные также удаляются (массив grandPrix).

Я могу предложить вам 3 решения: <Ч /> ПЕРВЫЙ

Сохраните ваш массив grandPrix в родительском UIViewController и передайте его в PredictorTableViewController, когда segue выполняется следующим образом:

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

ВТОРОЙ

Сохраните PredictorTableViewController в качестве строгой ссылки в родительском UIViewCointroller и вручную нажмите PredictorTableViewController на 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. с этими решениями НЕ используйте segues.

<Ч />

ТРЕТИЙ

Та же идея, что и в первом предложении, но данные массива grandPrix будут храниться в локальном кэше (например, база данных CoreData). Вам нужно будет написать функции извлечения / хранения данных локального кэша и использовать их соответственно, когда вам нужно получить доступ к существующим и сохранить новые объекты GrandPrix в вашем локальном кэше.

<Ч />

Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...