5

セルの内容に応じて動的なセルの高さを持つカスタムセルのテーブルビューがあります。

私の問題は、プログラムでviewDidLoadで、最後の行を除いて、動作する特定の位置にスクロールするように要求すると、次のようになります。行が表示されるが完全ではない場合もあれば、表示されない場合もあります。どちらの場合も、行を表示するには手動でスクロールする必要があります。

コードは次のとおりです。

[self.tableView reloadData];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:aRow inSection:aSection];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES ];

これはiOSのバグですか?回避策はありますか?

4

2 に答える 2

12

これまでのところ、私はそれを知るようになりました、

view画面にが表示される前に使用されていたすべての操作は、viewDidLoadすべてのUIオブジェクトで初期化されます。このメソッドでは、データオブジェクトを割り当てて初期化できます。

すべての操作データの変更、UIの変更はで行うview必要がありますviewDidAppear。または、一部の操作でさえ。で実行できますviewWillAppear

したがって、問題についてはUITableView、テーブルが画面に読み込まれて表示された後、つまりでスクロールを実行する必要がありますviewDidAppear

また、ビューがユーザーに表示されるたびにviewDidAppear&が呼び出されることに注意してください。したがって、最初のインスタンスについてのみテーブルをスクロールする場合は、インスタンスを示すフラグをヘッダーに含めることができます。viewWillAppear

于 2012-10-23T14:46:46.050 に答える
4
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
        NSIndexPath *rowIndexPath = [NSIndexPath indexPathForRow:3 inSection:0];
        [self.tableView scrollToRowAtIndexPath:rowIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
});

正確な理由はわかりませんが、行を追加して[tableView reloadData]を呼び出すと、tableViewがいくつかの内部カウンター(行カウンターなど)を更新して[tableView scrollToRowAtIndexPathを呼び出す時間がないため、このアプローチは機能すると思います。 ..]その時点ではそのような行がないため、効果はありません(ここでも、行を追加したり、tableViewのデータを初めて設定した場合は正しいでしょう)。呼び出し

dispatch_async(dispatch_get_main_queue(), ^{
    ...
}); 

[tableView reloadData]が、行カウンターを更新して既存の行へのスクロールを実行するのに十分な時間をtableViewに与えた後。

Vishyのアプローチは、十分な時間が与えられるという理由だけで機能しますが、画面が読み込まれたときに1回だけスクロールする必要がある場合にのみ適用できます。さらに、viewDid/WillAppearのたびにチェックするために醜いフラグが必要です。

于 2015-02-24T10:53:07.427 に答える