2011-09-18 6 views
7

私は自分のテーブルビューに問題があります。その上に表示されるモーダルビューコントローラを閉じると、常に上にスクロールします。私はKVOを使ってcontentOffsetへの変更を観察しようとしましたが、私の見解を混乱させるものはその背後にあります。ユーザーがself.tableView.contentOffsetがあり、モーダルダイアログで、彼のタスクを完了したときUITableViewControllerからdismissModalViewControllerAnimatedはcontentOffsetをリセットします

は、私が呼ん:

[self dismissModalViewControllerAnimated:YES] 

viewWillAppear:(BOOL)animatedが呼び出された後、self.tableView.contentOffsetはすでに0,0に設定されています。

これは起こっているはずですか?モーダルビューを表示する前にスクロール位置を覚えておき、モーダルビューを解除した後にviewWillAppearに戻すことで問題を回避できます。しかし、それは間違っているようです。何か不足していますか?

Dismiss modal view changes underlying UIScrollViewで説明した同様の問題が見つかりました。

+1

モーダルビューを閉じた後に 'viewDidLoad:'が呼び出されるかどうかチェックできますか? (私はこれがメモリの警告中に発生する可能性があることに気づきました。一部のコンポーネントは、ビューが押されてもアンロードされます)。 –

+0

babbidiには良い点があります。メモリ警告が発生した場合は、モーダルビューが上に表示されている間にビューをアンロードすることができます。 viewDidLoadメソッドでテーブルビューを初期化し、モーダルビューでメモリ警告が発生した場合は、モーダルビューを閉じたときにテーブルビューが再初期化されている可能性があります。 NSLogをviewDidUnloadとviewDidLoadに入れてください。 – MattyG

+0

私はすでに 'viewDidUnload'を監視していました - いいえ、ビューはアンロードされません。 – Palimondo

答えて

5

これはUITableViewControllerのデフォルト動作です。私は非常に単純なアプリでそれをテストし、それはあなたが言ったように正確に働いた。気に入らない場合は、代わりにUIViewControllerを使用してください。

+0

私の疑惑を確認していただきありがとうございます。 – Palimondo

+0

@ Split私はUIViewControllerを持っていますが、まだこの問題は再現可能です – iOSdev

5

ここでは、テーブルビューが元のスクロール位置を維持するようにこの問題を回避する方法を示します。 UITableViewControllerの私のサブクラスでは私が追加しました:

@property (assign) CGPoint lastScrollPosition; 

は、次に実装では、私は次のようにオーバーライドしています

- (void)viewWillAppear:(BOOL)animated 
{ 
    self.tableView.contentOffset = self.lastScrollPosition; 
} 

- (void)dismissModalViewControllerAnimated:(BOOL)animated 
{ 
    self.lastScrollPosition = self.tableView.contentOffset; 
    [super dismissModalViewControllerAnimated:animated]; 
} 

あなたのテーブルが最初のように、非ゼロ位置にスクロール表示させたい場合私は、あなたのviewDidLoadlastScrollPositionを初期化することを忘れないでください。

+0

ポストのためにPalimondoに感謝します。あなたは私のために正確な問題を解決しました! –

関連する問題