Я не могу найти никакого логического объяснения, но факт остается фактом: в iOS 5 (xCode 4.2), если я представлюModalView: * animated: YES, я могу вызвать dismissModalViewAnimated: * штраф, но если я вызову presentModalView: * animated: NO, затем вызывается метод dismiss, сбой. (Это работает так же, если я использую новый presentViewController: animated: завершение: + dismissViewControllerAnimated :). Я собираюсь попытаться обойти это сейчас (я не хочу, чтобы презентация была анимированной) и сообщить об ошибке в Apple, но я уже давно бьюсь над этим. Любые и все предложения приветствуются. Не так уж много на iOS 5, поэтому, пожалуйста, помогите, если можете. Пример кода, который не дает сбоя в iOS 4 или iOS 5:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];
Это приведет к сбою в iOS 5 с EXC_BAD_ACCESS при вызове dismiss:
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 приложение: 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];
}
В контроллере входа в систему:
- (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
}