2017-10-16 14 views
0

私は問題があり、チュートリアルオンラインや他の同様の問題を抱えた後に修正するように見えることはありません。これは私のコードで間違ったやり方をしたと思います。ネットワークリクエストからデータを取得した後に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 
} 

} 
+0

不可欠な部分にあなたのコードを削減してみてください。 'didReceiveMemoryWarning()'のようなものは助けになるわけではありません。 – LinusGeffarth

+0

私はお詫び申し上げます。 –

+0

あなたのダウンロードアイテムにコールバックを追加すると、データが更新された時点で終了します。別の可能性は、デリゲートを作成し、そのデリゲートを購読し、アイテムがダウンロードされたときにデリゲートを呼び出し、そのデリゲートが呼び出されたときに実行する必要があるものを実装するtableviewcontrollerで行います。 –

答えて

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 
} 
にこれを追加します

私はタイミングの問題があると思う... cellItemsが設定されると、それが自動的に呼び出されますので、今、あなたは他のtableview.reloadData()呼び出しを削除することができ、トップ

var cellItems: NSArray = NSArray() { 
    didSet { 
     tableview.reloadData() 
    } 
} 

+0

返信いただきありがとうございます、私はこれらの両方を追加し、残念ながら私は同じ結果を得る。 : –

+0

まだ動作しません。私は別の場所で、おそらく私のTypeItemsServerクラスの中に問題があると仮定するつもりです。私はこれらの変更を行ったことを今調査します。これは正解として –

+0

他の質問がある場合は – Ladislav

0

をこれを追加します。非同期データコールの直後にリロードしています。リロードしても、その時点でデータが整っていません。エスケープと関数を使用してみてくださいかのようなあなたのデータに「didSet」を使用します。

var dataArray: [type] { 
     didSet { 
      tableview.reloadData() 
     } 
    } 
関連する問題