如何在从网络请求中提取数据后重新加载视图控制器?

时间:2017-10-16 13:15:17

标签: ios uitableview

我遇到了一个问题,在查看在线教程和其他类似问题的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
}

}

2 个答案:

答案 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()
        }
    }