サブビューメソッドが呼び出されることに関連して、iOSバージョン固有のように見える奇妙な問題が発生しています。
どちらを表示するかを決定するよりも、親ViewControllerを使用して2つのスワップ可能なビューがあります。基本的に、ログイン時にアカウントビューにスワップアウトされ、ログアウト時に再びログアウトしてログインするログインビューがあります。
コードは非常に単純です。ログイン時に呼び出される親ViewControllerのサンプルメソッドを次に示します。
- (void) showAccountView:(BOOL)animated
{
if(self.accountController == nil)
self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
[self.loginController viewWillDisappear:animated];
[self.accountController viewWillAppear:animated];
[self.loginController.view removeFromSuperview];
[self.view insertSubview:alertsController.view atIndex:0];
[self.loginController viewDidDisappear:animated];
[self.accountController viewDidAppear:animated];
}
ログインビューを表示するためのこのようなものがもう1つあります。かなり簡単です。私が抱えている問題は、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappearメソッドがすべてiOS 4.3では1回呼び出されますが、iOS5.0と5.1では2回呼び出されることです。
たとえば、すべてのiOSバージョンで、サブビューのviewWillAppearは、親ビューが直接呼び出すときに呼び出されます(もちろん)。ただし、iOS 5.0および5.1のみが、insertSubviewの呼び出し中に2回目に呼び出されます。
したがって、removeFromSuperviewとinsertSubviewの呼び出しを除くすべてを削除すると、次のようになります。
- (void) showAccountView:(BOOL)animated
{
if(self.accountController == nil)
self.accountController = [[[AccountViewController alloc] initWithNibName:@"AccountViewController" bundle:nil] autorelease];
[self.loginController.view removeFromSuperview];
[self.view insertSubview:alertsController.view atIndex:0];
}
現在、5.0および5.1では、subviewメソッドはinsertSubview中にそれぞれ1回だけ呼び出されます。ただし、4.3ではまったく呼び出されないため、問題が発生します。
サブビューメソッドが呼び出されることを確認することに関連するいくつかの投稿を読みましたが、動作がiOSに依存しているこのようなものは見たことがありません。
また、これを機能させるために私が考えることができる唯一の方法は、実行時にiOSバージョンを確認し、iOS 4.3のサブビューメソッドを直接呼び出し、5.0および5.1では呼び出さないことです。
何か案は?