2017-11-29 13 views
0

私は、アプリケーションのいくつかの場所でループ内にtableView.reloadData()コールを持っています。tableView reloadDataはループ内の各パスでセルを描画しません

let dataSourceArray = [] 
for arrayItem in anotherArray { 
    dataSourceArray.append(arrayItem) 
    self.tableView.reloadData() 
} 

私が達成しようとしているのは、modelViewに読み込まれた各セルをtableViewに描画させることです。

現在、ループが完了すると、すべてのセルが表示されます。

これはすべてメインスレッドで行われていますが、私はreloadData呼び出しのためにメインスレッドにディスパッチしようとしました。それは何の違いもありませんでした。私はreloadDataの後にtableView.layoutIfNeeded()を試しました。

cellForRowAtIndexPathおよびheightForRow ...メソッドにブレークポイントを配置すると、ループ内の各パスで正常なtableView呼び出しが期待どおりに行われます。しかし何らかの理由で、ループが完了するまで細胞はスクリーンに描画されません。

私は上記の試行以外の各パスでセルを描画するためにtableViewを強制するとにかくありますか?

+1

なぜ 'reloadData'をまったく呼び出すのですか? 'insertRows(at')を使用して、単一行のテーブルビュー全体を再ロードせずに各行を挿入してください – rmaddy

答えて

0

私はあなたの要素のループが非常に(ミリ秒)非常に迅速に行われるため、理由がありますので、あなたは増分変更に気づかないでしょう。

+1

いいえ、理由は、現在のrunloopが完了するまでUIが更新されず、このループが終了した後、それは起こっているかどうかとはまったく関係ありません。 – rmaddy

0

以下のようにグローバルループ内で外部ループを実行し、reloadDataをメインキューにディスパッチする必要があります。

var dataSourceArray = [ String ]() 

@IBAction func 
DoA(_: Any?) { 

    let anotherArray = [ "A", "B", "C" ] 

    DispatchQueue.global().async { 
     for arrayItem in anotherArray { 
      self.dataSourceArray.append(arrayItem) 
      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
      Thread.sleep(forTimeInterval: 1) 
     } 
    } 
} 
0

見た目がきれいなアニメーションを表示したい場合は、追加するたびにタイマーを強制することができます。 UIView.animateまたはUIView.transitionを使用しています...私はトランジションメソッドを好むでしょう。ここで

はあなたが何ができるかのサンプル(あなた自身にそれを調整し、コピーがそれを直接貼り付けるいけない、私はそれをテストすることなく、遊び場にそれを書いた)それ以外

var i = 0 

func addItem(){ 
    if i == anotherArray.count { 
     return 
    } 
    UIView.transition(with: tableView, duration: 0.3, options: [.allowAnimatedContent, .transitionCrossDissolve], animations: { // content that is going to animate 
     dataSourceArray.append(anotherArray[i]) 
     tableView.reloadData() 
    }) { // completion block 
     i += 1 
     addItem() 
    } 
} 

で、あなたが変更することができます(ほとんどの場合、ストーリーボードから).topに設定されるように、あなたのtableViewの内容モードを変更するたびに、あなたのテーブルビューはジャンプするのではなく、上に固定し続ける(https://developer.apple.com/documentation/uikit/uiview/1622619-contentmode)。これは特に自動レイアウトを使用している場合に役立ちます

関連する問題