我试图在另一个视图以模态方式呈现后直接显示模态视图(第二个是出现的加载视图)。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Show load
LoadViewController *loader = [[LoadViewController alloc] init];
[self presentModalViewController: loader animated:NO];
[loader release];
}
但是当我这样做时,我得到一个“程序接收信号:”EXC_BAD_ACCESS“。”错误。
堆栈跟踪是:
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
有什么想法吗?我完全难过了!加载视图为空,因此肯定没有任何事情导致错误。是否与在同一个事件循环中以模态方式启动2个视图有关?
谢谢,
麦克
编辑:非常奇怪......我稍微修改了它,以便在稍微延迟后显示加载视图,这很好用!所以它似乎是在同一个事件循环中的东西!
- (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];
}
答案 0 :(得分:30)
我稍微修改了它,以便在很短的延迟后显示加载视图,这样可以正常工作!所以它似乎是在同一个事件循环中的东西!
- (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];
}
答案 1 :(得分:5)
我相信我在iOS 4中重现了同样的错误。在我的应用程序中,在显示第一个模态视图后立即尝试显示第二个模态视图时,崩溃始终发生。我挣扎了几个小时疯了。
在阅读了该主题中的帖子后,我尝试使用Tab Bar Application模板创建一个简单的可重现示例。我能够使用UIImagePickerController在响应“FirstViewController.m”中的按钮单击后显示第一个模态视图。当我试图再次显示UIImagePickerController时(在处理imagePickerControllerDidCancel消息之后),应用程序崩溃并出现相同的错误。
在设备上,根本不知道发生了什么。但是,当我在模拟器上运行代码时,我很幸运能在控制台上收到此消息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from to while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'
所以似乎我唯一的选择是遵循错误消息的建议,只需等到viewDidAppear(使用一个标志来表示我处于这种特殊模式),然后加载第二个模态视图。
这是完整性的完整堆栈跟踪:
** Call stack at first throw: ( 0 CoreFoundation 0x0238c919 __exceptionPreprocess + 185 1 libobjc.A.dylib 0x024da5de objc_exception_throw + 47 2 CoreFoundation 0x02345078 +[NSException raise:format:arguments:] + 136 3 Foundation 0x000ab8cf -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 4 UIKit 0x00544317 -[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 212 5 UIKit 0x0035c769 -[UIViewController presentModalViewController:withTransition:] + 2937 6 TestTempDelete 0x000021cf -[FirstViewController showImagePicker] + 167 7 Foundation 0x0002fcea __NSFireDelayedPerform + 441 8 CoreFoundation 0x0236dd43 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 9 CoreFoundation 0x0236f384 __CFRunLoopDoTimer + 1364 10 CoreFoundation 0x022cbd09 __CFRunLoopRun + 1817 11 CoreFoundation 0x022cb280 CFRunLoopRunSpecific + 208 12 CoreFoundation 0x022cb1a1 CFRunLoopRunInMode + 97 13 GraphicsServices 0x02bf12c8 GSEventRunModal + 217 14 GraphicsServices 0x02bf138d GSEventRun + 115 15 UIKit 0x002beb58 UIApplicationMain + 1160 16 TestTempDelete 0x00001eb4 main + 102 17 TestTempDelete 0x00001e45 start + 53
希望这有帮助。
答案 2 :(得分:4)
**如前所述,使用isIgnoringInteractionEvents
//Check if the app is ignoring interatctions, if so, add a delay for 1 sec
if([[UIApplication sharedApplication] isIgnoringInteractionEvents]==TRUE) {
[currentViewController performSelector:@selector(presentModalViewController:animated:) withObject:screen afterDelay:1];
} else {
[currentViewController presentModalViewController:screen animated:YES];
}
答案 3 :(得分:3)
如果你点击了一个链接到Interface Builder中的代码后,你可以得到这个,你有两个动作链接到一个按钮(也许你有一个模式视图链接到一个按钮,然后复制按钮并链接另一个模态视图)。这将尝试将它们都关闭,因此它将失败并显示该消息。
答案 4 :(得分:3)
我遇到了同样的异常
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试在转换已经进行时开始模式转换。等待viewDidAppear / viewDidDisappear知道当前转换已完成'
如前所述,我试图延迟提出模态转换,但这并没有真正帮助。然后我发现我有多个IBActions连接到我的按钮的TouchUpInside事件!!! 。在我的情况下,将开始两个IBActions:以模态方式呈现人物选择器并以模态方式呈现图像选择器。这解释了错误消息。检查您是否连接了多个IBAction!
答案 5 :(得分:1)
您的问题最有可能出现在viewDidAppear所在的方法中,或者在LoadViewController的init / viewDidLoad / viewWillAppear方法中。
设置一些断点并跟随直到崩溃......
答案 6 :(得分:1)
我认为这个问题与我遇到的问题有关。 它很容易重现:
创建新的XCode项目“实用程序应用程序”。在FlipsideViewController.m中 您只需插入以下方法:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear: animated];
[self showInfo];
}
如果你这样做,启动应用程序,然后右侧激活翻转视图 远。只要按下翻转视图上的“完成”按钮,您就会回来 到主视图再次触发viewDidAppear并直接返回到反面 - 视图。一旦显示翻转视图,应用程序就会停止 - 没有内存 调用deallocators - 它就像你按下了主页按钮一样。
当我在这些视图中使用其他一些属性时,我也得到了例外, 所以我把代码剥离到最低金额......
我真的不知道,这个问题究竟是什么......
祝你好运, 托拜厄斯
答案 7 :(得分:1)
点击UIButton
打开Modal View
时出现类似错误。我将UIButton's
听众从UIControlEventAllEvents
更改为UIControlEventTouchUpInside
。基本上,它是在Touch Down Inside
上触发模态视图,然后再在Touch Up Inside
上触发。
答案 8 :(得分:1)
由于
中的名称不匹配,我遇到了同样的问题HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];
和实际.xib文件的名称。
答案 9 :(得分:0)
这实际上取决于viewDidAppear
的支持例程正在做什么。例如,如果presentModalViewController:animated:
未保留loader
,则崩溃可能是由于UIWindowController
试图谈论已发布的loader
(在例行程序结束时)你发布了。)
答案 10 :(得分:0)
在使用与您实现加载视图相同的技术时遇到了类似的问题。当加载视图在加载结束时被解除时,它会崩溃。 在我的情况下,问题来自这样一个事实:只要加载视图被解除,再次调用viewDidAppear并尝试再次显示加载视图,这可能会触发崩溃。 我只是通过检查之前是否已经显示加载视图来修复它:
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if(needDisplayLoader)
[self presentModalViewController: loader animated:NO];
}
然后我在解除Loader视图
之前将needDisplayLoader设置为NO希望这会有所帮助......
答案 11 :(得分:0)
我刚才遇到了这个问题,并使用选择器更正了它:上面的afterDelay建议。只是添加,我在iPhone OS 4.0测试版下编译(没有修复),没有崩溃!因此,XCode中的错误似乎已在下一代修复。并不是说今天这对我们任何人都有好处,但是,大家都知道,它真的是 Xcode中的一个错误,而不一定是我们在编码风格上做错了。
答案 12 :(得分:0)
有完全相同的问题。用以上建议解决了......
[self performSelector:@selector(doit) withObject:nil afterDelay:0.5];
不得不使用0.5秒的延迟。可能是因为我在UIPickerViewController模式之后直接执行presentModalViewController。
答案 13 :(得分:0)
我刚遇到这个问题,原来我的问题是因为我是dealloc我的协议委托。
答案 14 :(得分:0)
我认为循环的原因是你加载的新视图控制器默认有一个viewDidAppear方法,它有
[super viewDidAppear animated];
这意味着它会再次回调到您的主视图控制器的viewDidAppear,就像它会循环回来一样
你在ViewController中的有一个像这样的方法,没有超级viewdidapper:
-(void)viewDidAppear:(BOOL)animated{
//[super viewDidAppear:animated]; no super
}
答案 15 :(得分:-2)
EXC_BAD_ACCESS
是内存错误。您可能正在尝试使用已释放/取消分配的对象。这个答案提供了一些调试这些问题的技巧: