私は問題があり、チュートリアルオンラインや他の同様の問題を抱えた後に修正するように見えることはありません。これは私のコードで間違ったやり方をしたと思います。ネットワークリクエストからデータを取得した後にView Controllerをリロードする方法はありますか?
私は2つのテーブルビューコントローラを持っています。
最初のTableViewControllerはデータベースから読み込まれますが、これはうまくいきます。私はセルの1つをクリックすると、(最初のVCで選択したものに応じて)データベースからも読み込まれるはずの2番目のTableViewControllerにつながります。私は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
}
}
不可欠な部分にあなたのコードを削減してみてください。 'didReceiveMemoryWarning()'のようなものは助けになるわけではありません。 – LinusGeffarth
私はお詫び申し上げます。 –
あなたのダウンロードアイテムにコールバックを追加すると、データが更新された時点で終了します。別の可能性は、デリゲートを作成し、そのデリゲートを購読し、アイテムがダウンロードされたときにデリゲートを呼び出し、そのデリゲートが呼び出されたときに実行する必要があるものを実装するtableviewcontrollerで行います。 –