项目在一个视图控制器中追加到数组,但在另一个视图控制器中不追加。

问题描述 投票:0回答:1

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

为了找出问题所在,我试着在下面的 HomeController然后将其追加到同一数组中,从 NotesController. 在后者中,当我打印 homeController.entryInput我在等 ["hello", "goodbye"]. 相反,我只得到 ["goodbye"].

另外,当我点击 "保存 "在 NotesController 第二次,我得到 ["goodbye"] 而不是 ["goodbye", "goodbye"]. 所以看起来数组被覆盖了。

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

HomeController。

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和其他网站关于向数组追加的内容 但不知为什么我似乎想不通为什么我不能向另一个类中的数组追加。

arrays swift uitableview viewcontroller
1个回答
0
投票

因为你已经创建了新的 主页控制器NotesController 不参考您当前的 主页控制器.

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

主页控制器 想开 NotesController.还有 NotesController 想回电 主页控制器.你应该通过 主页控制器 提及 NotesController.

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

回答你的问题。

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

    • 因为你是在实例化 主页控制器NotesViewController 你所创建的homeController并不一样。主页控制器 屏幕上出现的是新的sohomeController,而entryInput还是空的,因为viewDidLoad没有被调用。
  2. 当你从 NotesViewController{fnTahomafs10bord0shad01cH00FFFF}You'reexpecting["goodbye", "goodbye"]butyou get["goodbye"]instead。

    • 根据第一个答案,你可以在屏幕上创建一个新的homeController(与屏幕上现有的homeController无关),但却得到了[goodbye]。你在屏幕上创建了一个新的homeController(与屏幕上现有的homeController无关)。NotesController每当它出现在屏幕上时。

下面是结果。

  • 左图显示 主页控制器.
  • 中间图像显示 主页控制器 该开 输入控制器.
  • 右图显示 主页控制器 更新的 输入控制器.


我的实施。

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

0
投票

它看起来像这一行。

let homeController = HomeController()

创建一个新的类的实例 HomeController 而不引用已经存在的ViewController。这意味着:在新的ViewController实例中,修改数组的 HomeController 不会影响您的主ViewController。

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

@objc func save(sender: UIButton) get的调用,你把 "goodbye "追加到空数组中。

通过对 "再见 "的调用,你可以将 "再见 "附加到空数组中。calling dismiss(...) 您正在返回到您的原始版本的 HomeController() 中创建的其他实例的任何信息。NotesController().

为了实现你想做的事情,我建议多读一些关于如何在ViewControllers之间传递数据的文章。

© www.soinside.com 2019 - 2024. All rights reserved.