2017-05-07 8 views
-2

oneVCからsecondVCへ単純なStringを渡したいと思います。私はiOSを初めて使っています。なぜ私の値がsecondViewControllerに渡されないのですか

  1. 私はString nameOfFilmを宣言しました。
  2. CollectionViewItemをクリックすると、JSONをダウンロードして1つの値(String)を取得し、nameOfFilmに割り当てます。それから、私はセカンドVVを開始しています。適切な識別子とPrepareForSegue方法で
  3. IはnameOfFlimにsecondVC値を比較する。(nextScene.name = nameOfFilm)

結果でsecondVCが入ってくる場合、nextScene.nameはempty.enter画像でありますここでの説明 JSON iは正しく解析されました。私はそれが時間の不一致かもしれないと思うし、いくつかの機能が速すぎる。問題の原因は何ですか?ここ

var nameOfFilm = String() 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    INDEX_NUMBER_BEFORE = indexPath.row 
    let filmID = arrayWithID[INDEX_NUMBER_BEFORE] 
    downloadFilm(url: "https://api.themoviedb.org/3/movie/\(filmID)\(key)&append_to_response=videos,images") 
    performSegue(withIdentifier: "toTheDetail", sender: self) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "toTheDetail" { 
     let nextScene = segue.destination as! FilmDetailViewController 
     nextScene.name = nameOfFilm 
    } 
} 
+0

コードの画像を表示しないでください。あなたの質問に正しいコードを表示してください。 – matt

+0

@mattは私にそれを指摘してくれてありがとう。既に編集済みです。 –

+0

とdownloadFilmメソッドのコードを投稿してください、データ操作を確認する必要があります。 –

答えて

1

問題はdownloadFilmがバックグラウンドで発生し、要求を作成し、必要な値で応答するためにいくつかの時間がかかる非同期タスクになることになります。行うには

downloadFilm(url: "https://api.themoviedb.org/3/movie/\(filmID)\(key)&append_to_response=videos,images") { filmName in 
    self.nameOfFilm = filmName 
    self.performSegue(withIdentifier: "toTheDetail", sender: self) 
} 

あなたdownloadFilm機能を使用すると、応答値を待つし、その応答に基づいてアクションを実行できるように、これを使用する一般的な方法のようなものになるだろうコールバックを受け入れる必要がありますこれに類似したそのように、これはあなたが、あなたのdownloadFilm機能を更新する必要があるだろう...

func downloadFilm(url: String, completion: @escaping (_ filmName: String) -> Void) { 
    // do work here to setup network request 
    let task = URLSession.shared.dataTask(with: request) { data, response, error in 
     // parse response and get name 
     completion(name) 
    } 
} 

Hereは、概念を理解するのに役立ちますスウィフト完了ハンドラのガイドです。

関連する問題