web-dev-qa-db-ja.com

iOS 5:iPadでモーダルを閉じた後、-viewWillAppearが呼び出されない

私は次のコードを使用してモーダルを提示しています:

AddName *add = [[AddName alloc] initWithNibName:@"AddName" bundle:nil]
add.modalPresentationStyle = UIModalPresentationFormSheet;

[self presentModalView:add animated:YES];

そして、仕事が終わったら、次のコードを使用してメインビューに戻ります。

[self dismissModalViewControllerAnimated:YES];

したがって、デフォルトでは-viewWillAppearを呼び出すために使用されます。

私の問題は、

iOS4.で正常に動作していました。

しかし、それはiOS5では機能しません。

私は何をすべきか ?またはそれはiOS5のバグですか?

25
Devang

-viewWillAppearは、-viewWillDisappearも呼び出された場所でのみ呼び出されることが保証されています。 iPadのほとんどのモーダルウィンドウでは、ページ全体が隠されていないため、これは当てはまりません。

問題の解決策は、-viewWillAppearが何のために必要かによって異なりますが、一般に、モーダルビューコントローラーを閉じるのと同じ場所から直接電話をかける必要があります。

このための一般的なメカニズムの1つは、特に同じモーダルビューを別の場所で使用する場合に、ビューが消えようとしているときに呼び出されるデリゲートをモーダルビューコントローラーに与えることです。これにより、モーダルウィンドウから応答を取得したり、デリゲートビューでデータを強制的に再読み込みしたりすることができます。

お役に立てれば。

11
gaige

iOS5は間違いなく彼らの呼び出しをviewWillAppearviewWillDisappearに変更しました。たとえば、サブビュー(View Controller's views正確にはサブビューとして)UIScrollViewで、別のViewControllerをスタックにプッシュするとviewWillDisappearが呼び出されます。ただし、View Controllerがポップされると、viewWillAppearは呼び出されません。これらのメソッドは、iOS4のUIScrollViewサブビューで呼び出されることはありませんでした。

これは私にとって奇妙な行動です。何が起こるかに関係なく、iOS 4で発生することを信頼できれば、iOS 5でも動作が異なることはないはずです。ほとんどの場合、それぞれがどの特定のインスタンスで呼び出されるのかわかりません。 、私は通常、ゾーンコーディングを行っているので、試行錯誤します。それが私の好きなように機能する場合、私は先に進みます。次に、iOS 5が登場し、すべてにレッキングボールを投げます。

私はまた、UINavigationController'sビューはサブビューであり、ViewControllerはナビゲーションコントローラースタックにプッシュされます。viewWillAppearはiOS4では呼び出されませんが、iOS5では呼び出されます。図を参照してください。

9
Vinnie

私も同じ問題を抱えていました。モーダルを閉じた後、viewWillAppearは呼び出されませんが、viewDidAppearは呼び出されます。したがって、代わりにviewDidAppearを試してください。

2
Roman