2017-04-26 10 views
4

指定されたインデックス(self.boldRowPath)にスクロールしますが、reloadData()の前にscrollToRowをデバッグするときに実行します。reloadData()を知る方法は彼の仕事を完了しましたか?

reloadDataの情報は、どのように完成しましたか?

func getAllTimeEvent() { 
    self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo) 
    self.tblTimeEvent.reloadData() 
    self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true) 
} 

ご協力いただければ幸いです。

+0

あなたが見ていることを確認します(https://stackoverflow.com/questions/16071503 [のUITableViewはReloadDataを完了したときにどのように伝えるために?] /覚えておいてください - 完了した - リロードデータ)。それは客観的に - cであるが、そこに提供された答えはより完全である... – Honey

+0

@ハニーこれは8ヶ月前に尋ねられ、私はこのリンクを見つけなかったbcoz迅速なタグがないので、 google。 –

+0

正確には、この質問がスウィフトとマークされているので、私が重複としてマークしていない理由です:) – Honey

答えて

6

は、それが動作するはずです、これをやってみてください。

self.tblTimeEvent.reloadData() 
DispatchQueue.main.async(execute: { 
    self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true) 
}) 

これは、メインスレッド上にScrollToRowを実行しますreloadDataが行われた後に(それがメインスレッド上にあるため)、それは意味

+0

あなたの答えをありがとう。それは私に役立ちます –

+0

ummm。 tableviewはメインスレッドのすべての時間にリロードしてはいけませんか?それはUIの更新ではありませんか? – Honey

+0

reloadData()を呼び出すと、リロード中にテーブルビューをスクロールできないように、メインスレッド上でreloadData()がリロードされます。メインスレッド上で呼び出すと、reloadDataが終了した直後にキューに入れられます。 @Honey –

1

ます前回のtableView(_:willDisplay:forRowAt:)が画面上の可視セクションに対して呼び出されたときに、UITableViewがリロードされたというかなり確かな前提ができます。

ので(セクション0の行が画面に利用可能なスペースを取るのtableViewのために)このような何かを試してみてください。

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    let lastRowIndex = tableView.numberOfRows(inSection: 0) 
    if indexPath.row == lastRowIndex - 1 { 
    // tableView done reloading 
    self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true) 
    } 
} 
+0

毎回よくチェックしますか?別の方法はありませんか? –

+0

tableview:willdisplay:forrowat:tableview ..内のすべての項目に対して呼び出されるのではなく、表示されている行だけです。tableviewがスクロールされると、これは機能しません。 – deebee

2

としてはthis answerに説明し、UITableViewのリロードが次に起こりますレイアウトの実行(通常、実行ループに制御を戻すとき)。

したがって、メインディスパッチキューを使用して次のレイアウトの後にコードをスケジュールすることができます。あなたの場合:

func getAllTimeEvent() { 
     self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo) 
     self.tblTimeEvent.reloadData() 
     DispatchQueue.main.async { 
      self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true) 
     } 
    } 

layoutIfNeededを手動で呼び出してレイアウトを強制することもできます。しかし、これは(前のオプションがベストです)一般的に良いアイデアではありません。

func getAllTimeEvent() { 
     self.arrAllTimeEvent = ModelManager.getInstance().getAllTimeEvent(from: self.apportmentDateFrom, to: self.apportmentDateTo) 
     self.tblTimeEvent.reloadData() 
     self.tblTimeEvent.layoutIfNeeded() 
     self.tblTimeEvent.scrollToRow(at: self.boldRowPath ?? [0,0], at: .top, animated: true) 
    } 
関連する問題