如何附加到另一个视图控制器上的数组

How to append to an array on another view controller

我在 tableView 中有一个数组,它显示该数组的内容,我可以将值附加到数组。问题是每当我转到另一个页面时,它会自动清空,但我希望这些值保留在那里。这是我的第一个视图控制器的代码:

//  AddFoodViewController.swift
//  grosseries
//
//  Created by Amish Tyagi on 6/2/20.
//  Copyright © 2020 grosseries. All rights reserved.
//

import UIKit

class AddFoodViewController: UIViewController {  
    @IBOutlet weak var foodTextField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


    @IBAction func doneTapped(_ sender: Any) {
    }

    func transitionToNext() {
        let homeViewController = storyboard?.instantiateViewController(identifier: "TableViewController") as? TableViewController
        view.window?.rootViewController = homeViewController
        view.window?.makeKeyAndVisible()
    }
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "toTableViewController") {
            let homeViewController = segue.destination as? TableViewController
            homeViewController?.food.append(foodTextField.text!)
            view.window?.rootViewController = homeViewController
        }
    }

}

这是我的第二个视图控制器的代码:

//  TableViewController.swift
//  grosseries
//
//  Created by Amish Tyagi on 5/29/20.
//  Copyright © 2020 grosseries. All rights reserved.
//

import UIKit

class TableViewController: UIViewController{
    @IBOutlet var tableView: UITableView!

    var food : [String]! = []

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        // Do any additional setup after loading the view.

    }
    @IBAction func addItemTapped(_ sender: Any) {
        transitionToNext()
    }
    func transitionToNext() {
        let nextViewController = storyboard?.instantiateViewController(identifier: "AddFoodViewController") as? AddFoodViewController

        view.window?.rootViewController = nextViewController
        view.window?.makeKeyAndVisible()
    }
}

extension TableViewController : UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("you tapped me :)")
    }
}


extension TableViewController : UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return food.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

        cell.textLabel?.text = food[indexPath.row]

        return cell
    }


}

这是我的故事板布局的图片: 任何帮助将不胜感激!

在 Storyboard 中,select 你的 TableViewController Storyboard 和 select Editor->Embed in->Navigation Controller:

在您的 tableView 下方(或您想要的任何其他地方)添加一个带有 segue 的按钮以显示 AddFoodViewController

现在,在您的 AddFoodViewController 上添加一个按钮来确认您在 textField 中放入的食物:

@IBAction func confirmAddedFood(_ sender: Any) {
    guard let tableViewVC = navigationController?.viewControllers.first as? TableViewController else { return }
    tableViewVC.food.append(foodTextField.text!)
    navigationController?.popViewController(animated: true)
}

您不再需要 AddFoodViewController 上的食物阵列,但您仍然需要 TableViewController 上的食物阵列。

添加食物后返回时不要忘记重新加载 tableView,在 TableViewController 添加:

override func viewWillAppear(_ animated: Bool) {
    tableView.reloadData()
}

你的TableViewController

class TableViewController: UIViewController{
    @IBOutlet var tableView: UITableView!

    var food: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        // In the case when not using prototype cell.
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.dataSource = self
    }

    override func viewWillAppear(_ animated: Bool) {
        tableView.reloadData()
    }
}

extension TableViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return food.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = food[indexPath.row]

        return cell
    }
}

FoodViewController

class AddFoodViewController: UIViewController {
    @IBOutlet weak var foodTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func confirmAddedFood(_ sender: Any) {
        guard let tableViewVC = navigationController?.viewControllers.first as? TableViewController else { return }
        tableViewVC.food.append(foodTextField.text!)
        navigationController?.popViewController(animated: true)
    }
}

只给出已经完成的代码不是很酷,但我认为在这种情况下只是一个愚蠢的错误,无论是你还是我。