如何通过位于一个 VC 中的 UITextField 将新字符串附加到数组以填充位于另一个中的 TableView?
How to append new string to array via UITextField located in one VC, to populate TableView located in another?
为什么TableView 不显示添加的新字符串?如何解决?
第一个VC:
@IBAction func saveButtonPressed(_ sender: UIButton) {
var textField = UITextField()
let alert = UIAlertController(title: "Save current run", message: "", preferredStyle: .alert)
let action = UIAlertAction(title: "Save", style: .default) { (action) in
RunHistoryTableViewController().runArray.append(textField.text!)
RunHistoryTableViewController().tableView.reloadData()
}
alert.addTextField { saveRunTextField in
saveRunTextField.placeholder = "Name your run"
textField = saveRunTextField
}
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
}
秒VC:
var runArray = ["BMW M3 Run 1", "BMW M3 Run 2", "Renault Megane RS"]
//MARK: TableView DataSource:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return runArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RunCell", for: indexPath)
cell.textLabel?.text = runArray[indexPath.row]
return cell
}
}
请记住,我是初学者,需要一些帮助,因为 none 我的想法似乎可行。
每次调用 RunHistoryTableViewController()
时,您都在实例化一个新的 VC。如果您当时只显示一个 VC,您可以使用 prepareForSegue
方法在一个到另一个之间传递数据,并在目标参数中获取目标 VC 的实际实例方法。
代码 RunHistoryTableViewController()
调用视图控制器的初始化程序。它创建了一个全新的视图控制器实例,与任何其他实例无关。
此代码:
RunHistoryTableViewController().runArray.append(textField.text!)
创建 RunHistoryTableViewController, and appends textField.text to its
runArray, and then on the next line, that new instance of
RunHistoryTableViewControllergets thrown away. Same issue with the next line. You create a new
RunHistoryTableViewController` 的新实例,尝试引用它的 table 视图并告诉它重新加载。我预计该行会崩溃,因为新实例的 table 视图将不存在。
您需要一种方法来指向您要在屏幕上显示(或已经显示)的另一个视图控制器。
您如何在视图控制器之间导航?这将决定您如何在它们之间传递数据。
我认为你有两种方法可以做到这一点:
1- 使用协议并在此协议中传递数据
2- 使用 segue 并在此 segue 中传递数据
这种情况下最推荐的解决方案是使用协议来获取结果并具有良好的性能。
为什么TableView 不显示添加的新字符串?如何解决?
第一个VC:
@IBAction func saveButtonPressed(_ sender: UIButton) {
var textField = UITextField()
let alert = UIAlertController(title: "Save current run", message: "", preferredStyle: .alert)
let action = UIAlertAction(title: "Save", style: .default) { (action) in
RunHistoryTableViewController().runArray.append(textField.text!)
RunHistoryTableViewController().tableView.reloadData()
}
alert.addTextField { saveRunTextField in
saveRunTextField.placeholder = "Name your run"
textField = saveRunTextField
}
alert.addAction(action)
present(alert, animated: true, completion: nil)
}
}
秒VC:
var runArray = ["BMW M3 Run 1", "BMW M3 Run 2", "Renault Megane RS"]
//MARK: TableView DataSource:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return runArray.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "RunCell", for: indexPath)
cell.textLabel?.text = runArray[indexPath.row]
return cell
}
}
请记住,我是初学者,需要一些帮助,因为 none 我的想法似乎可行。
每次调用 RunHistoryTableViewController()
时,您都在实例化一个新的 VC。如果您当时只显示一个 VC,您可以使用 prepareForSegue
方法在一个到另一个之间传递数据,并在目标参数中获取目标 VC 的实际实例方法。
代码 RunHistoryTableViewController()
调用视图控制器的初始化程序。它创建了一个全新的视图控制器实例,与任何其他实例无关。
此代码:
RunHistoryTableViewController().runArray.append(textField.text!)
创建 RunHistoryTableViewController, and appends textField.text to its
runArray, and then on the next line, that new instance of
RunHistoryTableViewControllergets thrown away. Same issue with the next line. You create a new
RunHistoryTableViewController` 的新实例,尝试引用它的 table 视图并告诉它重新加载。我预计该行会崩溃,因为新实例的 table 视图将不存在。
您需要一种方法来指向您要在屏幕上显示(或已经显示)的另一个视图控制器。
您如何在视图控制器之间导航?这将决定您如何在它们之间传递数据。
我认为你有两种方法可以做到这一点:
1- 使用协议并在此协议中传递数据
2- 使用 segue 并在此 segue 中传递数据
这种情况下最推荐的解决方案是使用协议来获取结果并具有良好的性能。