DiscissmodalViewControllerAnimated: (и DimissiSseCoControllerAnimated) сбой в iOS 5
-
27-10-2019 - |
Вопрос
Я не могу найти никакого логического объяснения, но факт остается фактом, что в iOS 5 (xcode 4.2), если я представлю модалвью:* Анимирован: да, я могу назвать DistissmodalViewAnimated:* fine, но если я позвоню в PresentModalView:* Animated: нет , затем вызов метода увольнения сбой. (Это работает так же, если я использую New ReadingViewController: Animated: Завершение: + DimissiSevewControllerAnimated :). Я собираюсь попытаться обойти это на данный момент (я не хочу анимировать презентацию) и сообщать об ошибке 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, которая случается на 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];
}
В 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
}
Решение
В iOS5 управление жизненным видом каким -то образом изменилось, и я не могу объяснить эту проблему подробно. В любом случае, исправление состоит в том, чтобы отложить этот рабочий процесс от ApplicationDidfinishLaunchingWithoptions to ApplicationDidbeComeactive. Кажется, что что -то не инициализируется прямо при вызове ApplicationDidfinishLaunchingWithoptions.
- (void)applicationDidFinishLaunchingWithOptions:... {
// in order to do this only at launching, but not on every activation
// Declaration as property for example
applicationDidLaunch = YES;
}
- (void) applicationDidBecomeActive:(UIApplication *)application {
if (applicationDidLaunch) {
applicationDidLaunch = NO;
[Start your login Workflow with modal view presenting here]
}
}
Любопытно ур отзывы :) ....
Другие советы
Я добавлю свои 2 цента: у меня был ImagePickerController, и я увольнял, работая только тогда, когда я не выпустил сборщика вручную (iOS 5 SDK).
Так. Для вашего случая я мог бы предложить такой обходной путь: 1. Удалить линию - [LoginController Release]; 2. Чтобы предотвратить утечки памяти добавить LoginController в качестве свойства в ваш текущий контроллер и выпустите его только в Dealloc () текущего контроллера:
@interface myViewController : UIViewController
@property (nonatomic, retain) LoginController *loginController;
@end
...
@implementation myViewController
- (void)showLoginPanel {
self.loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
// ... something goes here
}
-(IBAction)loginClose()
{
// this should close all windows as far as you call it from current (main) controller
[self dismissModalViewControllerAnimated:YES];
// ... then anything you want EXCEPT [loginController release];
}
-(void)dealloc()
{
[loginController release];
}
@end
Удачи :)
PS Я только что написал это, так что это просто идея, как его обмануть. Somebosy может поправить меня ... хотя в любом случае это сработало для меня.