2016-07-10 25 views
1

、私はparse.comSWIFT:完了ハンドラので

enter image description here

から件のデータをダウンロードして、私はすべての画像がテーブルビューに表示提示しなければならない方法loadData()を持っています。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("ReusableCell", forIndexPath: indexPath) as! LeaguesTableViewCell 

    loadData { (success) in 
     if success { 
      cell.leagueImage.image = UIImage(data: self.leaguesImage[indexPath.row]) 
      cell.leagueNameLabel.text = self.leagues[indexPath.row]["name"] as? String 
     } else { 
      cell.leagueNameLabel.text = "Wait" 
     } 
    } 


    return cell 

} 

これは機能しませんでした。私はviewDidLoad()で私の機能を呼び出すが、それも正しくない、テーブルビューは空です。私の配列が空である

マイ

+0

あなたがそれに挿入する前に適切に配列を「ロック」され、また..「動作しませんでした」説明して? – Brandon

+0

これは単にメソッドcellForAtIndexPathには行かず、テーブルビューは空です。 –

+0

セルが表示されない場合、デリゲートの 'numberOfRowsInSection'と' numberOfSectionsInTableView'の実装は不正です(0を返します)。どちらかまたはあなたは決してtableViewのdataSourceとdelegateを設定しません。 – Brandon

答えて

1

Cuzの

enter image description here は、最初のデリゲートとデータソースを設定してください。ビューコントローラ以外の別のデータソースがある場合は、それを保持します。そうしないと、コールバックを取得できません。

+0

class LeaguesTableViewController:UITableViewController、私は何も必要ありません –

+0

あなたはself.tableView.reloadData()を試しましたか? – Arsalan

+0

ええ、毎回変更した後にこれを行う(didSet) –

2

のUITableViewにデータをロードするための基本的な手順は次のとおり

  1. ロードnumberOfSectionsInTableView:方法のセクションのデータ
  2. リロードテーブルビュー
  3. 戻り番号:あなたのケースでは1のみ存在しますセクション。
  4. tableView:numberOfRowsInSection:の行数を返します。データがロードされている場合、あなたのケースではリーグの数を返します。データがロードされていない場合は、1を返し、テーブルビューに少なくとも1つの行があり、「Wait」メッセージが表示されます。
  5. データからセルを作成して入力します。leaguesおよびleaguesImageを使用します。

例:

private var loaded = false 

override func viewDidLoad() { 
    super.viewDidLoad() 

    loaded = false 

    loadData() { success in 
     NSOperationQueue.mainQueue().addOperationWithBlock() { 
      self.loaded = success 
      self.tableView.reloadData() 
     } 
    } 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection: Int) -> Int { 
    if loaded { 
     return leagues.count 
    } 
    else { 
     return 1 
    } 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("ReusableCell", forIndexPath: indexPath) as! LeaguesTableViewCell 

    if loaded { 
     cell.leagueImage.image = UIImage(data: self.leaguesImage[indexPath.row]) 
     cell.leagueNameLabel.text = self.leagues[indexPath.row]["name"] as? String 
    } 
    else { 
     cell.leagueNameLabel.text = "Wait" 
    } 

    return cell 
} 
+1

これは大体正しいですが、何かを表示する前に画像を取得するのを待つべきではありません。彼は 'Leagues'フェッチ(かなり速くなければならない)を行うべきですが、画像を取得するのではありません。そして、 'cellForRowAtIndexPath'は遅れてイメージを取り出すべきです。画像は大きくなり、検索する人の数がわからないので、それらのすべてを取得するのが遅くなる可能性があります。 – Rob

関連する問題