問題描述
我找不到任何合乎邏輯的解釋,但事實仍然是,在 iOS 5 (xCode 4.2) 中,如果我 presentModalView:* animated:YES,我可以調(diào)用dismissModalViewAnimated:* 很好,但如果我調(diào)用 presentModalView:*動畫:否,然后調(diào)用解除方法崩潰.(如果我使用新的 presentViewController:animated:completion:+dismissViewControllerAnimated:),這同樣適用.我現(xiàn)在要嘗試解決這個問題(我不希望演示文稿動畫化)并向Apple報告一個錯誤,但我一直在努力解決這個問題.歡迎任何和所有建議.iOS 5 上沒有多少,所以如果可以,請?zhí)峁椭?在 iOS 4 或 iOS 5 中不會崩潰的示例代碼:
I can't find any logical explanation, but the fact remains that, in iOS 5 (xCode 4.2), if I presentModalView:* animated:YES, I can call dismissModalViewAnimated:* fine, but if I call presentModalView:* animated:NO, then calling the dismiss method crashes. (This works the same if I use the new presentViewController:animated:completion: + dismissViewControllerAnimated:). I am going TRY to work around this for now (I don't want the presentation animated) and report a bug to Apple, but I have been beating my head on this for a while. Any and all suggestions are welcome. Not much out there on iOS 5, so please help if you can. Sample code that does not crash in iOS 4 or iOS 5:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];
這將在 iOS 5 中崩潰,并在解除調(diào)用時出現(xiàn) EXC_BAD_ACCESS:
This will crash in iOS 5 with EXC_BAD_ACCESS on the dismiss call:
LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS
注意:我在 loginController 中有一個動畫,它發(fā)生在 viewDidLoad 上.去看看把它拿出來是否會改變?nèi)魏螙|西,但我想把它拿出來,因為我需要盡快找到解決方案.
One note: I have an animation within the loginController that happens on viewDidLoad. Going to see if taking that out changes anything, but I wanted to get this out there since I need a solution asap.
完整代碼流程...在 AppDelegate 中,application:didFinishLaunchingWithOptions:
Full code flow... In AppDelegate, application:didFinishLaunchingWithOptions:
if (!loggedIn) [myViewController showLoginPanel];
在 myViewController 中:
In 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:
Back in 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 中,生命周期的管理發(fā)生了某種變化,我無法詳細解釋這個問題.無論如何,解決方法是將工作流從 applicationDidFinishLaunchingWithOptions 推遲到 applicationDidBecomeActive.似乎在調(diào)用 applicationDidFinishLaunchingWithOptions 時沒有正確初始化某些內(nèi)容.
In iOS5 the managing of the lifecyle somehow changed and I cannot explain that issue in detail. Anyway, the fix is to postpone that workflow from applicationDidFinishLaunchingWithOptions to applicationDidBecomeActive. It seems that something isn't initialized right at the call of 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]
}
}
很好奇你的反饋:)....
Curious to ur feedback :)....
這篇關(guān)于dismissModalViewControllerAnimated:(和dismissViewControllerAnimated)在iOS 5中崩潰的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!