我正在尝试将数据从 UIViewController 推送到 UITableView。现在我可以将一条数据推送到单元格并且看起来很好。如果我返回并推送更多数据,我遇到的问题只是覆盖单元格。而不是继续到另一个牢房。我已经尝试了这个 post 的建议
和 self.tableView.reloadData()
。这似乎并没有解决我遇到的问题。以下是我编写的代码。
class PredictorTableViewController: UITableViewController {
var predictorTrack = ""
var firstDriver = ""
var secondDriver = ""
var thirdDriver = ""
var grandPrix = [GrandPrix]()
override func viewDidLoad() {
super.viewDidLoad()
self.grandPrix.append(GrandPrix(granPrix: predictorTrack, firstDriver: firstDriver, secondDriver: secondDriver, thirdDriver: thirdDriver))
self.tableView.reloadData()
self.navigationItem.title = "Predictor"
let backbutton = UIButton(type: .custom)
backbutton.setTitle(" Back", for: .normal)
backbutton.setTitleColor(.blue, for: .normal)
backbutton.addTarget(self, action: #selector(self.backbuttonpressed), for: .touchUpInside)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: backbutton)
setupNavBar()
}
@objc func backbuttonpressed() {
dismiss(animated: true, completion: nil)
}
func setupNavBar(){
navigationController?.navigationBar.prefersLargeTitles = true
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return grandPrix.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! GrandPrixTableViewCell
let race = self.grandPrix[indexPath.row]
// Configure the cell...
cell.grandPrix.text = race.grandPrix
cell.firstPostion.text = race.firstDriver
cell.secondPosition.text = race.secondDriver
cell.thirdPostion.text = race.thirdDriver
return cell
}
下面是准备segue的函数。
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "getPredictor" {
let predictorVC = segue.destination as! UINavigationController
let vc = predictorVC.topViewController as! PredictorTableViewController
vc.predictorTrack = TrackTextField.text!
vc.firstDriver = firstTextField.text!
vc.secondDriver = secondTextField.text!
vc.thirdDriver = thirdTextField.text!
}
}
最佳答案
你的问题是,每当你返回到 PredictorTableViewController
的前一个 UIViewConntroller
实例时,它就会从内存中删除,因此与之关联的所有数据也会消失(大奖赛
数组)。
我可以向您推荐 3 种解决方案:
首先
将 grandPrix
数组保存在父级 UIViewController
中,并在像这样执行 segue 时将其传递给 PredictorTableViewController
:
var grandPrix = [GrandPrix]()
...
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "getPredictor" {
let predictorVC = segue.destination as! UINavigationController
let vc = predictorVC.topViewController as! PredictorTableViewController
// append new GrandPrix to local array
self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!))
// important part: pass local data to destination
vc.grandPrix = self.grandPrix
}
}
第二个
将 PredictorTableViewController
作为父级 UIViewCointroller
的强引用,并在需要时手动将 PredictorTableViewController
推送到 UINavigationController
.
// Strong lazy reference
lazy var predicatorController: PredicatorTableViewController = {
// If needed, this can be loaded from a NIB or Storyboard
return PredicatorTableViewController()
}()
要在 UINavigationController
函数之后使用此调用:
// generate new data for predicatorController and append it to grandPrix array
predicatorController.grandPrix.append(...)
// show predicatorController
self.navigationController?.pushViewController(predicatorController, animated: true)
附言使用此解决方案时请勿使用 segues。
第三个
与第一个建议的想法相同,但 grandPrix
数组的数据将存储在本地缓存中(例如 CoreData 数据库)。您将必须编写本地缓存数据检索/存储函数,并在需要访问现有 GrandPrix 对象并将新的 GrandPrix 对象存储到本地缓存中时相应地使用它。
祝你好运:)
关于ios - 将数据推送到 UITableView 未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752987/