9

UITableViewには再利用可能なセルがたくさんあり、そのうちの1つをタップすると、そのセルの詳細を表示する別のView Controllerに移動します(プッシュセグエ経由)(アイテムだとしましょう。アイテムに関する詳細が表示されます) - 名前、価格、画像など...)。そのView Controllerを(戻るボタンをタップして)ポップするとUITableView、奇妙な動作が発生します。

a)一番下までスクロールすると、自動的に少し上にスクロールし(約50ポイント)、最後のセルがほとんど見えなくなるため、もう一度下にスクロールする必要があります。私のセルはすべて、高さが 60 ポイントあります。

b) スクロールバーは常に表示されてから消え、何かが動いていることを示しますUITableView(ただし、一番下までスクロールしないと、コンテンツは自動的に移動しません)。

これUITableViewは、アプリにある複数の で発生します。viewWillAppear でテーブル ビューの再読み込みを強制しているわけではないので、何が起こっているのかわかりません。サーバーからロードした後、コンテンツは静的です (ユーザーがコンテンツを変更してからリロードが実行されない限り)。しかし、単純に項目の詳細を表示してその VC をポップしても、テーブル ビューでは何も変わりません。

編集:さて、問題が何であるかを理解しました:UIToolbarそのセグエをプッシュするときに a を隠しています。常に表示したままにしておくと(これは望ましくありません)、テーブルビューでポップするときにスクロールバーのアニメーションが表示されますが、最後の数行の場合はテーブルビューがスクロールしません。

4

6 に答える 6

3

この動作は、iOS 8.x のバグです。

これまでに与えられたすべての回答は、実際に問題を解決することはできません。問題は、たとえばビューがプッシュされているときにテーブルが再描画されているときに、iOS が以前に計算されたセル サイズを考慮しない (または考慮しない) ことです。

これを解決するための 1 つの方法がここにあります:プッシュ セグエとリターンで UITableView レイアウトがめちゃくちゃになる (iOS 8、Xcode beta 5、Swift)(したがって、この質問はこれと重複しています)。

ただし、そこで提供されるソリューションは過剰であり、このキャッシングが失敗する特定の状況があります (たとえば、UIContentSizeCategoryDidChangeNotification は考慮されません)。

しかし、奇妙ではありますが、非常に簡単な解決策があります。

performSequeWithIdentifierでマニュアルを使用している場合はdidSelectRowAtIndexPath、直前に を追加し[self.tableView reloadData]ます。

セルから IB シークを使用している場合は、コードを追加するだけ[self.tableView reloadData]ですprepareForSeque

これで問題が解決する理由は、これにより iOS が表示セルを再推定し、コンテンツを別の場所にスクロールしなくなるためです。幸いなことにtableView reloadData、可視セルのみが再推定されるため、ここではオーバーヘッドがあまりかかりません。

于 2015-03-21T11:03:07.377 に答える
0

私もこの問題に直面していました。私はそれを見つけることができました。私の場合の理由は、テーブルビューのヘッダーの高さがテキストに基づいて計算され、テキストの高さが負であったため、コンテンツインセットとスクロールインセットがゼロであってもテーブルビューが下にシフトしていたためです。

これは初めてのことでした。次回は正しい計算です。私が見つけた奇妙なことの1つは、クラスA(テーブルビューを持っている)がinitから別のクラスBをプッシュしたときです。クラス B のキーボードを開くと、クラス A の viewDidLoad が呼び出されます。クラス B がナビゲーション コントローラーからアンロードされる前。クラス A の Tableview がリロードされます。

于 2016-02-05T14:59:34.297 に答える
0

ふと、悪党scrollToRowAtIndexPath:atScrollPosition:animatedがぶらぶらしていませんか?

于 2013-07-12T15:16:29.670 に答える