論理的な説明は見つかりませんが、iOS 5(xCode 4.2)では、presentModalView:*アニメーション:YESの場合、dismissModalViewAnimated:*を正常に呼び出すことができますが、presentModalView:*アニメーション:NOを呼び出すと、事実は変わりません。 、次にdismissメソッドを呼び出すとクラッシュします。(これは、新しいpresentViewController:animated:completion:+ dismissViewControllerAnimated:を使用した場合も同じように機能します)。私は今のところこれを回避して(プレゼンテーションをアニメーション化したくない)、Appleにバグを報告するつもりですが、私はしばらくの間これに頭を悩ませてきました。ありとあらゆる提案を歓迎します。iOS 5にはあまりありませんので、できれば助けてください。iOS4またはiOS5でクラッシュしないサンプルコード:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];
これは、iOS5でEXC_BAD_ACCESSを使用して却下呼び出しでクラッシュします。
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS
注:loginController内に、viewDidLoadで発生するアニメーションがあります。それを取り除くことで何かが変わるかどうかを見に行くが、私はできるだけ早く解決策が必要なので、これをそこに出したかった。
[編集]完全なコードフロー...AppDelegateで、application:didFinishLaunchingWithOptions:
if (!loggedIn) [myViewController showLoginPanel];
myViewControllerの場合:
- (void)showLoginPanel {
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
[self presentViewController:loginController animated:NO completion:nil];
} else {
[self presentModalViewController:loginController animated:NO]; //iOS 4 works fine with or without animation
}
[loginController release];
}
loginControllerの場合:
- (IBAction)closeLoginWindow {
[[NSNotificationCenter defaultCenter] postNotificationName:@"CloseLoginWindow" object:nil];
} //doing it this way because calling on the self.parentViewController doesn't work
myViewControllerに戻ります。
- (void) viewDidLoad
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeLoginWindow) name:@"CloseLoginWindow" object:nil];
...
- (void)closeLoginWindow {
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
[self dismissViewControllerAnimated:YES completion:nil]; //iOS 5 crashes only if presentation was not animated
} else [self dismissModalViewControllerAnimated:YES]; //deleting the previous condition, iOS 5 still crashes if presentation was not animated
}