我试图在另一个视图以模态方式呈现后直接显示模态视图(第二个是出现的加载视图)。

- (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];  
}
有帮助吗?

解决方案

我稍微修改了它,以便在很短的延迟后显示加载视图,这样可以正常工作!所以它似乎是在同一个事件循环中的东西!

- (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];  
}

其他提示

我相信我在iOS 4中重现了同样的错误。在我的应用程序中,在显示第一个模态视图后立即尝试显示第二个模态视图时,崩溃始终发生。我挣扎了几个小时疯了。

在阅读了该主题中的帖子后,我尝试使用Tab Bar Application模板创建一个简单的可重现示例。我能够使用UIImagePickerController在响应“FirstViewController.m”中的按钮点击后显示第一个模态视图。当我再次尝试显示UIImagePickerController时(在处理imagePickerControllerDidCancel消息之后),应用程序崩溃并出现相同的错误。

在设备上,根本不知道发生了什么。但是,当我在模拟器上运行代码时,我很幸运能在控制台上收到此消息:

<代码> ***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试在转换已经进行时开始模式转换。等待viewDidAppear / viewDidDisappear知道当前转换已完成'

所以似乎我唯一的选择是遵循错误消息的建议,只需等到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

希望这有帮助。

**如前所述,使用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];
    }

如果你点击了一个链接到Interface Builder中的代码后,你可以得到这个,你有两个动作链接到一个按钮(也许你有一个模式视图链接到一个按钮,然后复制按钮并链接另一个模态视图)。这将尝试将它们都关闭,因此它将失败并显示该消息。

我遇到了同样的异常

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'尝试在转换已经进行时开始模式转换。等待viewDidAppear / viewDidDisappear知道当前转换已完成'

如前所述,我试图延迟提出模态转换,但这并没有真正帮助。然后我发现我有多个IBActions连接到我的按钮的TouchUpInside事件!!! 。在我的情况下,将开始两个IBActions:以模态方式呈现人物选择器并以模态方式呈现图像选择器。这解释了错误消息。检查您是否连接了多个IBAction!

您的问题最有可能出现在viewDidAppear所在的方法中,或者在LoadViewController的init / viewDidLoad / viewWillAppear方法中。

设置一些断点并跟随直到崩溃......

点击 UIButton 打开模态视图时出现类似错误。我将 UIButton的侦听器从 UIControlEventAllEvents 更改为 UIControlEventTouchUpInside 。基本上,它是在 Touch Down Inside 上启动模态视图,然后再在 Touch Up Inside 上启动。

由于

中的名称不匹配,我遇到了同样的问题
HelpViewController *controller = [[HelpViewController alloc] initWithNibName:@"HelpView" bundle:nil];

和实际.xib文件的名称。

我认为这个问题与我遇到的问题有关。 它很容易重现:

创建新的XCode项目“实用程序应用程序”。在FlipsideViewController.m中 您只需插入以下方法:

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear: animated];
  [self showInfo];
}

如果你这样做,启动应用程序,然后右侧激活翻转视图 远。只要按下“完成”按钮,在侧面视图上的按钮,你会回来 到主视图再次触发viewDidAppear并直接返回到反面 - 视图。一旦显示翻转视图,应用程序就会停止 - 没有内存 调用deallocators - 它就像你按下了主页按钮一样。

当我在这些视图中使用其他一些属性时,我也得到了例外, 所以我把代码剥离到最低金额......

我真的不知道,这个问题究竟是什么......

祝你好运, 托拜厄斯

这实际上取决于 viewDidAppear 的支持例程。例如,如果 presentModalViewController:animated:不保留 loader ,则崩溃可能是由于 UIWindowController 试图谈论 loader 已经发布(在您发布的例程结束时)。

在使用与您实现加载视图相同的技术时遇到了类似的问题。当加载视图在加载结束时被解除时,它会崩溃。 在我的情况下,问题来自这样一个事实:只要加载视图被解除,再次调用viewDidAppear并尝试再次显示加载视图,这可能会触发崩溃。 我只是通过检查之前是否已经显示加载视图来修复它:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    if(needDisplayLoader)
        [self presentModalViewController: loader animated:NO];
}

然后我在解除Loader视图

之前将needDisplayLoader设置为NO

希望这会有所帮助......

我刚才遇到了这个问题,并使用选择器更正了它:上面的afterDelay建议。只是添加,我在iPhone OS 4.0测试版下编译(没有修复),没有崩溃!因此,XCode中的错误似乎已在下一代修复。并不是说今天这对我们任何人都有好处,但是,大家都知道,它真的 Xcode中的一个错误,而不一定是我们在编码风格上做错了。

有完全相同的问题。用以上建议解决了......

<代码> [self performSelector:@selector(doit)withObject:nil afterDelay:0.5];

不得不使用0.5秒的延迟。可能是因为我在UIPickerViewController模式之后直接执行presentModalViewController。

我刚遇到这个问题,原来我的问题是因为我是dealloc我的协议委托。

我认为循环的原因是你加载的新视图控制器默认有一个viewDidAppear方法,它有

[super viewDidAppear animated];

这意味着它将再次回调到您的主视图控制器的viewDidAppear,就像它将循环回来一样

你在ViewController中的

有一个像这样的方法,没有超级viewdidapper:

-(void)viewDidAppear:(BOOL)animated{
    //[super viewDidAppear:animated]; no super

}

EXC_BAD_ACCESS 是内存错误。您可能正在尝试使用已释放/取消分配的对象。这个答案提供了一些调试这些问题的技巧:

调试<代码> EXC_BAD_ACCESS

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top