我遇到了一个问题,在查看在线教程和其他类似问题的SO问题之后似乎无法修复它,这让我觉得我在代码中做错了什么/不好的做法。
我有2个表视图控制器。
第一个TableViewController是从数据库填充的,所有这一切都正常。当我单击其中一个单元格时,它会分割成第二个TableViewController,它也应该从数据库中填充(取决于您在第一个VC中选择的内容)。
目前,如果我点击TVC1中的一个单元格进入TVC2并且它是空的,那么我在导航控制器中单击并选择其他内容,它会返回到TVC2并向我显示我的第一个选择。这表明在网络从数据库返回数据之前正在加载TVC2 ....所以,我尝试在viewDidLoad和viewDidAppear等各种地方使用tableView.reloadData(),但我似乎无法得到它工作
以下是TVC的。我坚持使用MVC设计模式,并没有为每个TVC包含模型和severConnection代码,因为我不想让帖子过于复杂,但是如果你想看到我要更新。
提前感谢您的帮助。
TableViewController1
class MenuTypeTableViewController: UITableViewController, MenuTypeServerProtocol {
//Properties
var cellItems: NSArray = NSArray()
var selectedItem = String()
override func viewDidLoad() {
super.viewDidLoad()
let menuTypeServer = MenuTypeServer()
menuTypeServer.delegate = self
menuTypeServer.downloadItems()
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier: String = "cellType"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
let item: MenuTypeModel = cellItems[indexPath.row] as! MenuTypeModel
myCell.textLabel?.text = item.type
return myCell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let selectedCell = tableView.cellForRow(at: indexPath)
selectedItem = (selectedCell?.textLabel?.text)!
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "typeItems" {
let destinationVC = segue.destination as? TypeItemsTableViewController
destinationVC?.selectedItem = self.selectedItem
}
}
}
TableViewController2:
class TypeItemsTableViewController: UITableViewController, TypeItemsServerProtocol {
//Properties
var cellItems: NSArray = NSArray()
var selectedItem: String = String()
let typeItemsServer = TypeItemsServer()
override func viewDidLoad() {
super.viewDidLoad()
typeItemsServer.delegate = self
self.typeItemsServer.foodType = self.selectedItem
self.typeItemsServer.downloadItems()
self.tableView.reloadData()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cellItems.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellIdentifier: String = "cellTypeItem"
let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
let item: TypeItemsModel = cellItems[indexPath.row] as! TypeItemsModel
myCell.textLabel?.text = item.name!
return myCell
}
}
答案 0 :(得分:0)
尝试将其添加到
TypeItemsTableViewController
和
override func viewDidLoad() {
super.viewDidLoad()
cellItems = NSArray()//make sure you have the empty array at the start
typeItemsServer.delegate = self
self.typeItemsServer.foodType = self.selectedItem
self.typeItemsServer.downloadItems()
self.tableView.reloadData()
}
在顶部添加
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
typeItemsServer.delegate = nil
}
现在您可以删除其他var cellItems: NSArray = NSArray() {
didSet {
tableview.reloadData()
}
}
来电,因为一旦tableview.reloadData()
设置就会自动调用...
答案 1 :(得分:0)
我认为你有时间问题。您在异步数据通话后立即重新加载。您重新加载,但当时您的数据尚未到位。尝试使用转义函数或使用" didSet"对您的数据如:
var dataArray: [type] {
didSet {
tableview.reloadData()
}
}