我想显示的顶级iPhone异常处理程序UIAlertView中。处理函数如下所示:

void applicationExceptionHandler(NSException *ex) {
  UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                      message:[ex reason]
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil];
  [alertView show];
}

我见过类似的代码在其他地方(例如, NSSetUncaughtExceptionHandler赶不上iPhone上的所有错误)。

如果我单步在调试器,我可以看到,异常处理程序被调用时,我可以看到当前屏幕变暗,仿佛它会显示在它前面的警报,但没有出现。调试器之外,应用程序只是立即退出并返回到系统主屏幕。

它确实,如果我在陷阱的applicationDidFinishLaunching错误,并且在返回前有显示警报的工作。我认为警报视图从来没有得到一个机会,因为该应用程序被终止(而不是坐在那里什么都不做,如果我只是保释的applicationDidFinishLaunching出)在异常处理程序来显示。有没有一种方法,使这项工作?

有帮助吗?

解决方案

我不知道[alertView show]究竟是如何实现的,但我想它做了一些更改视图层次,然后将自身设置通过运行循环来显示下一通警报(查找NSRunLoop)。

但是,因为应用程序是要退出的,控制不返回到运行循环,所以永远不会显示警报。这就是为什么你看到屏幕变暗(警戒级别的UIWindow立即被show加),但警报不会出现(这将在运行循环发生)。

如果您包括[[NSRunLoop currentRunLoop] run]在异常处理程序结束后,可能会出现警告。

如果您想让您的应用程序退出,一旦警报完成后,你也许可以通过调用一个while循环NSRunLoop的runUntilDate:,检查标志的值,看看是否有警报尚未开除这样做。如果有,只是退出处理函数,你是好去。这意味着你将必须设置一个委托对象上的警报这台该标志。

如果您想让您的应用程序继续运行......还有我不那么肯定。你可以只让运行循环继续异常处理程序的运行,但是有可能是坏的/奇怪的副作用这一点。所以你应该让应用程序退出。此外,如果你确定你可以从异常,你应该在什么地方抓住它恢复。

其他提示

由于堆到benzado,这就是我认为这是一个伟大的通用顶级异常处理程序。我是一个初学者,所以希望它是正确完成,但它的工作:)

在我的... appDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    [window makeKeyAndVisible];

    NSSetUncaughtExceptionHandler(&exceptionHandler);

    return YES;
}

BOOL exceptionAlertDismissed = FALSE;
void exceptionHandler(NSException *exception)
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"App Committed Suicide"
        message:@"Oh dear, that wasn't supposed to happen. You will have to restart the application... sorry!"
        delegate:[[UIApplication sharedApplication] delegate] cancelButtonTitle:nil otherButtonTitles:@"That's ok!", @"Erm, bye...", nil];
    [alert show];
    [alert release];

    while (exceptionAlertDismissed == FALSE)
    {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    exceptionAlertDismissed = TRUE;
}

在我的... appDelegate.h:

@interface ...appDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate>
...
void exceptionHandler(NSException *exception);

您是否到达代码应验证,或者如果你只是显示问题。

的NSLog的将澄清,

如果没有达到,就需要防止应用程序停机,您可能需要延迟作用得到这方面的警告呼叫出来:

[self performSelector: @selector(showAlert:) withObject:@"msg" afterDelay: 0.1];

如果你正在接近它和执行上下文是不是一个问题,但你根本没有看到警报,然后[警报显示]可以不在显示顶层。在这种情况下,可能会需要重定向消息经由showinview例如与actionsheet:

topDelegate=[[UIApplication sharedApplication] delegate];
topDelegateWindow=[topDelegate.window.subviews objectAtIndex:0];

[actionSheet showInView:topDelegateWindow];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top