I'm trying to display a modal view straight after another view has been presented modally (the second is a loading view that appears).
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Show load
LoadViewController *loader = [[LoadViewController alloc] init];
[self presentModalViewController: loader animated:NO];
[loader release];
}
But when I do this I get a "Program received signal: "EXC_BAD_ACCESS"." error.
The stack trace is:
0 0x30b43234 in -[UIWindowController transitionViewDidComplete:fromView:toView:]
1 0x3095828e in -[UITransitionView notifyDidCompleteTransition:]
2 0x3091af0d in -[UIViewAnimationState sendDelegateAnimationDidStop:finished:]
3 0x3091ad7c in -[UIViewAnimationState animationDidStop:finished:]
4 0x0051e331 in run_animation_callbacks
5 0x0051e109 in CA::timer_callback
6 0x302454a0 in CFRunLoopRunSpecific
7 0x30244628 in CFRunLoopRunInMode
8 0x32044c31 in GSEventRunModal
9 0x32044cf6 in GSEventRun
10 0x309021ee in UIApplicationMain
11 0x00002154 in main at main.m:14
Any ideas? I'm totally stumped! The loading view is empty so there's definitely nothing going on in there that's causing the error. Is it something to do with launching 2 views modally in the same event loop or something?
Thanks,
Mike
Edit: Very strange... I have modified it slightly so that the loading view is shown after a tiny delay, and this works fine! So it appears to be something within the same event loop!
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Show load
[self performSelector:@selector(doit) withObject:nil afterDelay:0.1];
}
- (void)doit {
[self presentModalViewController:loader animated:YES];
}
It really depends on what the support routines for
viewDidAppear
are doing. For example, ifpresentModalViewController:animated:
does not retainloader
the crash may be due to theUIWindowController
trying to speak aboutloader
which has since been released (at the end of the routine you posted).I have modified it slightly so that the loading view is shown after a tiny delay, and this works fine! So it appears to be something within the same event loop!
**Like was said earlier, use isIgnoringInteractionEvents
I had a similar problem while using the same technique as you to implement a loading view. It would crash when the loading view was dismissed at the end of the load. In my case, the problem came from the fact that as soon as the loading view was dismissed viewDidAppear was called again and tried to present the loading view again, which presumably triggered the crash. I fixed it simply by checking if the loading view had been presented before:
Then I set needDisplayLoader to NO before dismissing the Loader view
Hope this helps...
I had a similar error when clicking on a
UIButton
to open aModal View
. I changed theUIButton's
listener fromUIControlEventAllEvents
toUIControlEventTouchUpInside
. Basically, it was firing the Modal View onTouch Down Inside
and then again onTouch Up Inside
.I ran into this issue just now, and corrected it using the selector:afterDelay suggestion above. Just to add, I compiled (without the fix) under iPhone OS 4.0 beta, and NO CRASH! So, the bug in XCode appears to have been fixed in the next gen. Not that this does any of us any good today, but, just so you all know, it truly was a bug in Xcode and not necessarily anything we were doing wrong in our coding styles.