显示警报在iPhone顶级异常处理程序
-
21-09-2019 - |
题
我想显示的顶级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];