Я не могу найти какого-либо логического объяснения, но факт остается фактом: в iOS 5 (xCode 4.2), если я представлюModalView:*animated:YES, я могу вызвать rejectModalViewAnimated:* нормально, но если я вызову presentModalView:*animated:NO , а затем вызов метода отклонения приводит к сбою. (Это работает так же, если я использую новый presentViewController:animated:completion: + rejectViewControllerAnimated:). Я собираюсь ПОПЫТАТЬСЯ обойти это сейчас (я не хочу, чтобы презентация была анимированной) и сообщить об ошибке в 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 при вызове отклонения:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS
Одно примечание: у меня есть анимация в loginController, которая происходит при просмотреDidLoad. Собираюсь посмотреть, изменит ли это что-нибудь, но я хотел сделать это там, так как мне нужно решение как можно скорее.
[Изменить] Полный поток кода... В 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];
}
В логинконтроллере:
- (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
}