我有一个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和其他网站关于向数组追加的内容 但不知为什么我似乎想不通为什么我不能向另一个类中的数组追加。
因为你已经创建了新的 主页控制器 在 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)
}
回答你的问题。
从NotesController保存后调用。你期待["hello", "goodbye"],但你得到的是["goodbye"]。
当你从 NotesViewController{fnTahomafs10bord0shad01cH00FFFF}You'reexpecting["goodbye", "goodbye"]butyou get["goodbye"]instead。
下面是结果。
我的实施。
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)
}
}
它看起来像这一行。
let homeController = HomeController()
创建一个新的类的实例 HomeController
而不引用已经存在的ViewController。这意味着:在新的ViewController实例中,修改数组的 HomeController
不会影响您的主ViewController。
这也导致了你关于数组中缺少 "hello "元素的问题的答案。当你创建对象 homeController
它的数组中没有任何元素。
当 @objc func save(sender: UIButton)
get的调用,你把 "goodbye "追加到空数组中。
通过对 "再见 "的调用,你可以将 "再见 "附加到空数组中。calling dismiss(...)
您正在返回到您的原始版本的 HomeController()
中创建的其他实例的任何信息。NotesController()
.
为了实现你想做的事情,我建议多读一些关于如何在ViewControllers之间传递数据的文章。