2017-11-24 14 views
1

テレビ番組とサムネイル画像を以下のように設定することはできません。 print(shows)文がすべての項目を正しく出力するので、データの配列を正しく生成しています。誰かが私が間違っているのを見ることができます。エラーはありませんが、私の意見はイメージやタイトルなしで空になっています。ここ はここTvControllerクラス'didset'から返された値はありません。JSONは配列データをデコードしました

class TvController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 

var tvShows: [RecentTvList]? = [] 


func fetchTvItems() { 

    let jsonUrlString = "https://www.what-song.com/api/recent-tv?page=1" 
    guard let url = URL(string: jsonUrlString) else 
    {return} 

    URLSession.shared.dataTask(with: url) { (data, response, err) in 

     guard let data = data else {return} 

     do { 

      let shows = try 
       JSONDecoder().decode(RecentTvListData.self, from: data) 
      print(shows) 

      self.tvShows = shows.data 

     } catch let jsonErr { 
      print("Error serializing JSON", jsonErr) 
     } 

    }.resume() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchTvItems() 

    navigationItem.title = "TV" 
    navigationController?.navigationBar.isTranslucent = false 

    collectionView?.backgroundColor = .white 

    collectionView?.register(TvCell.self, forCellWithReuseIdentifier: cellId) 
    collectionView?.register(Header.self, forSupplementaryViewOfKind: 
     UICollectionElementKindSectionHeader, withReuseIdentifier: headerId) 
} 

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    if let count = tvShows?.count { 
     return count 
    } 

    return 0 

} 

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! TvCell 

    cell.televisionShow = tvShows?[indexPath.item] 

    return cell 
} 
} 

は、モデルファイルである:ここでは

struct RecentTvListData: Decodable { 
var data: [RecentTvList] 
} 

struct RecentTvList: Decodable { 
var title: String? 
var poster_url: String? 
} 

セルの表示である:すべてのビュー/サブビュー/制約が正しく設定されている、私は単に」didnのこれをすべて膨大に膨らませてしまうので、コードを含めて気にしない。私は非常に問題がモデルかコントローラのどちらかにあると確信しています。データをダウンロードする

var tvShowsController: TvController? 


var televisionShow: RecentTvList? { 
    didSet { 
     titleLabel.text = televisionShow?.title 
     setupThumbnailImage() 
     thumbnailImageView.image = UIImage(named: (televisionShow?.poster_url)!) 
    } 
} 

let thumbnailImageView: UIImageView = { 
    let imageView = UIImageView(image: #imageLiteral(resourceName: "stranger things poster")) 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    imageView.layer.cornerRadius = 6 
    imageView.contentMode = .scaleAspectFill 
    imageView.layer.masksToBounds = true 
    return imageView 
}() 

let titleLabel: UILabel = { 
    let title = UILabel() 
    title.text = "Stranger Things" 
    title.font = UIFont(name: "Montserrat", size: 17) 
    title.translatesAutoresizingMaskIntoConstraints = false 
    return title 
}() 

答えて

1

(すなわちURLSession.shared.dataTask(with: url)次のブロック内のすべてのコードは)iOSのは、それがすぐに終了し、する必要があるとして、それはできるだけ多くの時間を持っている別のスレッドでそのコードを実行されることを意味し、非同期操作であり、現在の(この場合はメインの)スレッドの実行を継続します。コレクションビューが読み込まれてデータを表示しようとすると、まだダウンロードが完了していないため、表示するデータはありません。あなたはそれがreloadDataを呼び出すことにより、ダウンロードが終了だ後、このように、あなたのデータをロードするためにあなたのコレクションビューを強制することができます。

URLSession.shared.dataTask(with: url) { (data, response, err) in 

    guard let data = data else {return} 

    do { 

     let shows = try 
      JSONDecoder().decode(RecentTvListData.self, from: data) 
     print(shows) 

     self.tvShows = shows.data 
     self.collectionView?.reloadData() 

    } catch let jsonErr { 
     print("Error serializing JSON", jsonErr) 
    } 

}.resume() 
+2

それはのUIViewControllerではありません。彼はUICollectionViewControllerをサブクラス化しています。デリゲートとデータソースを設定する必要はありません –

+2

ああ、ありがとう、私はそれを見落とした。私は私の答えのその部分を削除しました –

+0

Ahhhh sooooに多く感謝!本当に感謝します、私は数時間それを把握しようとしています:S –

関連する問題