项目附加到一个视图控制器中的数组,但不附加到另一个视图控制器中

Item appends to array in one view controller but not in another

我有一个 TableView,它显示单元格中的条目列表。这些条目存储在一个数组中。用户在另一个视图控制器(模态)中为条目输入文本,点击 "Save",在 .reloadData() 之后,新条目应附加到数组并显示在 TableView 中。该数组位于 HomeController 中。

为了查明问题可能出在哪里,我尝试在 HomeController 中附加一些文本,然后从 NotesController 附加到同一个数组。在后者中,当我打印 homeController.entryInput 时,我期望 ["hello", "goodbye"]。相反,我只得到 ["goodbye"].

另外,当我第二次点击 NotesController 中的 "Save" 时,我再次得到 ["goodbye"] 而不是 ["goodbye", "goodbye"]。所以看起来数组被覆盖了。

我也尝试过将项目硬编码到数组中,它们在 TableView 中显示得很好。当我从 NotesController 追加一个项目时,它追加到数组但不显示在 TableView 上,当我从同一个 ViewController 添加另一个项目时,它覆盖我追加的第一个项目而不是将其添加为新项目。

家庭控制器:

class HomeController: UIViewController {

    let tableView = UITableView()

    var entryInput: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        setupTableView()
    }

    func setupTableView() {
        tableView.delegate = self
        tableView.dataSource = self

        self.entryInput.append("hello")
        print(entryInput)

        tableView.register(HomeCell.self, forCellReuseIdentifier: reuseIdentifier)

        let height = view.frame.height
        tableView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: height)

        tableView.backgroundColor = .white

        view.addSubview(tableView)
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! HomeCell
        cell.entryTextLabel.text = entryInput[indexPath.row]

        return cell
    }

NotesController:

class NotesController: UIViewController {
    let homeController = HomeController()
    ...
    let saveBtn = UIView().navigationBtn(text: "Save")

    let homeController = HomeController()override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        saveBtn.addTarget(self, action: #selector(save(sender:)), for: .touchUpInside)
    }

    @objc func save(sender: UIButton) {
        homeController.entryInput.append("goodbye")
        homeController.tableView.reloadData()

        print(homeController.entryInput)

        dismiss(animated: true, completion: nil)
    }
}

我查看了 Stack Overflow 和其他网站关于附加到数组的内容,但出于某种原因似乎无法弄清楚为什么我不能附加到另一个 class 中的数组。

这行看起来像:

let homeController = HomeController()

创建 class HomeController 的新实例并且不引用已经存在的 ViewController。这意味着:在 HomeController 的新实例中修改数组不会影响您的主要 ViewController.

这也会导致您关于数组中缺少 "hello" 元素的问题的答案。当您创建对象时 homeController 它的数组没有任何元素。

当调用 @objc func save(sender: UIButton) 时,您将 "goodbye" 附加到空数组。

通过 calling dismiss(...) 您将返回到 HomeController() 的原始版本,它对您在 NotesController().

中创建的其他实例一无所知

为了实现您的目标,我建议阅读更多有关如何在 ViewController 之间传递数据的信息:

因为你在NotesController[=中创建了新的HomeController 82=] 未引用您当前的 HomeController.

class NotesController: UIViewController {
    let homeController = HomeController()
}

HomeController想打开NotesController. NotesController 想要与 HomeController 通信。 您应该将 HomeController 引用传递给 NotesController.

func routeToNotesController() {
    let vc = NotesViewController()
    vc.homeController = self
    let nc = UINavigationController(rootViewController: vc)
    present(nc, animated: true)
}

回答您的问题。

  1. 保存后从 NotesController 调用。你在期待 ["hello","goodbye"] 但你得到的是 ["goodbye"]。

    • 因为你在实例化HomeController NotesViewController 你创建的homeController不是 同样的 HomeController 出现在屏幕上,是新的所以 homeController 和 entryInput 仍然是空的,因为 viewDidLoad 不是 打电话。
  2. 当您从 NotesViewController 添加另一个项目时,您 期待 ["goodbye", "goodbye"] 但你得到 ["goodbye"] 相反。

    • 根据第一个答案。您创建新的 homeController(不是 与屏幕上现有的相关)在 NotesController 中 每次出现在屏幕上。

这是结果。

  • 左图显示HomeController.
  • 中图显示 HomeController 打开 InputsController.
  • 右图显示由 InputsController[= 更新的 HomeController 82=].


我的实现。

class ListViewController: UITableViewController {
    var entryInput: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "ListViewController"
        tableView.backgroundColor = .white
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(add))
        entryInput.append("hello")
        tableView.reloadData()
    }

    @objc func add() {
        let vc = InputViewController()
        vc.listViewController = self
        let nc = UINavigationController(rootViewController: vc)
        present(nc, animated: true)
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return entryInput.count
    }

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

class InputViewController: UIViewController {
    weak var listViewController: ListViewController?

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "InputViewController"
        view.backgroundColor = .white
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(save))
    }

    @objc func save() {
        listViewController?.entryInput.append("goodbye")
        listViewController?.tableView.reloadData()
        dismiss(animated: true)
    }
}