[解決済み] [Solved] UITableViewがReloadDataを完了したことを伝えるには?
質問
UITableViewのパフォーマンスが終了した後、一番下までスクロールさせようとしています。
[self.tableView reloadData]
私はもともと
[self.tableView reloadData]
NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
しかし、reloadDataは非同期であることを読み、スクロールが起こらないのは
self.tableView
,
[self.tableView numberOfSections]
と
[self.tableView numberOfRowsinSection
はすべて0です。
ありがとうございます。
何が変かって、私が使っているのは
[self.tableView reloadData];
NSLog(@"Number of Sections %d", [self.tableView numberOfSections]);
NSLog(@"Number of Rows %d", [self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1);
コンソールでは、Sections = 1, Row = -1 が返されます。
全く同じNSLogを
cellForRowAtIndexPath
Sections = 1 と Row = 8; が表示されます(8が正しい)。
どのように解決するのですか?
リロードは次のレイアウトパスの間に行われます。これは通常、実行ループに制御を戻したとき(たとえば、ボタンアクションなどが戻った後)に起こります。
したがって、テーブル・ビューが再読み込みされた後に何かを実行する1つの方法は、単にテーブル・ビューが直ちにレイアウトを実行するように強制することです。
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection: ([self.tableView numberOfSections]-1)];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
もう1つの方法は、アフターレイアウトのコードを後で実行するように
dispatch_async
:
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
NSIndexPath* indexPath = [NSIndexPath indexPathForRow: ([self.tableView numberOfRowsInSection:([self.tableView numberOfSections]-1)]-1) inSection:([self.tableView numberOfSections]-1)];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
});
アップデイト
さらに調べてみると、テーブルビューから
tableView:numberOfSections:
と
tableView:numberOfRowsInSection:
から戻る前に、そのデータソースに
reloadData
. デリゲートが
tableView:heightForRowAtIndexPath:
から戻る前に、テーブルビューもそれを(各行に対して)送信します。
reloadData
.
しかし、テーブルビューは
tableView:cellForRowAtIndexPath:
または
tableView:headerViewForSection
レイアウトフェーズまでは、デフォルトではランループに制御を戻したときに発生します。
また、小さなテストプログラムでは、ご質問のコードはテーブルビューの一番下まできちんとスクロールすることがわかりました。
なし
を送信するような)特別なことは何もしていません。
layoutIfNeeded
を使用したり
dispatch_async
).
関連
-
[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] イニシャライザーの要素がコンパイル時定数でない
-
[解決済み] Objective-Cの#importと#includeの違いは何ですか?
-
[解決済み] Objective-Cのnil、NIL、nullの違いについて
-
[解決済み] Xcodeでコンソールに何かを印刷するには?
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] メソッド名と行番号を出力し、NSLogを条件付きで無効にする方法は?
-
[解決済み] CocoaPodsを使用している場合、.gitignoreには何が入るのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"
-
[解決済み] MPProgressHUDとNSSessionを使用したデータシンクの読み込み
-
[解決済み] Objective-Cでオブジェクトをキャストする方法
-
[解決済み] .02fと%.2fの違いは何ですか?
-
[解決済み] Objective-Cは構造体の使用を禁じていますか?
-
[解決済み] objective-c/cocoaで例外を投げる
-
[解決済み] newの代わりにalloc initを使用する
-
[解決済み】NSDateで年/月/日を取得する。
-
[解決済み】isEqual:とハッシュをオーバーライドするためのベストプラクティス
-
[解決済み] UITableViewのロード終了を検出する方法