如何从网络请求中提取数据后重新加载视图控制器?
我有一个问题,似乎无法修复后,在网上看到的教程和其他SO问题与类似的问题,这让我觉得我做了一些错误/在我的代码相关的不良做法。如何从网络请求中提取数据后重新加载视图控制器?
我有2个表视图控制器。
第一个TableViewController从数据库中填充,所有这些工作正常。当我点击其中一个单元时,它会继续到第二个TableViewController,它也应该从数据库中填充(取决于您在第一个VC中选择的内容)。
目前,如果我点击TVC1中的一个单元格,它会转到TVC2并且它是空的,然后我在导航控制器内点击并选择其他内容,它会返回到TVC2并向我显示我的第一个选择。这表明TVC2在网络从数据库返回数据之前正在加载....所以,我尝试在不同的地方使用tableView.reloadData(),如viewDidLoad和viewDidAppear,但我似乎无法得到它工作。
下面是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
}
}
尝试增加这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()
电话,因为一旦cellItems
设置就会自动被调用......
感谢您的回复,我添加了这两个,不幸的是我得到了相同的结果。 ( –
)仍然不起作用,我现在假设我在其他地方有一个问题,也许在我的TypeItemsServer类中,现在我将调查那些我已经做出的更改,谢谢你的时间和精力。这是正确的答案。 –
当然,如果你有任何其他问题,请告诉我 – Ladislav
我认为你有一个时机的问题。您在异步数据调用之后立即重新加载。您重新加载,但当时您的数据不存在。尝试使用功能转义或使用“didSet”您的数据,如:
var dataArray: [type] {
didSet {
tableview.reloadData()
}
}
请尽量减少您的代码到基本部分。像'didReceiveMemoryWarning()'这样的东西没有任何帮助,但是这个问题很混乱。 – LinusGeffarth
我很抱歉,让我更新 –
您可以添加一个回调到您的下载项目,所以当你完成刷新你的数据。另一种可能是你创建了一个委托,你订阅了这个委托,当你的项目被下载时,你调用了委托并在你的tableviewcontroller中实现了该委托被调用时应该做什么,在你的情况下重新加载数据。 –