UIAlertView 在启动时导致警告消息

Posted

技术标签:

【中文标题】UIAlertView 在启动时导致警告消息【英文标题】:UIAlertView causing warning message on startup 【发布时间】:2012-03-16 12:39:47 【问题描述】:

nilMy 应用程序需要运行一些检查,然后可能会在我的应用程序激活时显示UIAlertView。为此,我已注册 didBecomeActiveNotification 并在此处运行我的检查。

每当我的UIAlertView初始启动期间弹出时,就会出现问题,它会导致“应用程序在应用程序结束时应该有一个根视图控制器启动”消息。我猜这是因为UIAlertView 显示在viewDidAppear: 之前。

如果不在didBecomeActiveNotification 中,我应该如何触发我的UIAlertView

2012-03-16 12:21:47.238 App[4181:707] viewDidLoad:
2012-03-16 12:21:47.462 App[4181:707] didBecomeActiveNotification:
2012-03-16 12:21:47.793 App[4181:707] Applications are expected to have a root view controller at the end of application launch
2012-03-16 12:21:48.500 App[4181:707] viewDidAppear:

编辑:要在新项目中触发此操作,请执行以下操作。

1 个新项目 -> 单视图应用程序

2 在 Viewcontroller.m 中将以下内容添加到 viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil];

3 在 ViewController.m 中添加以下方法

 -(void)didBecomeActiveNotification:(NSNotification *)notification
   
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:nil delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
    [alertView show];
    [alertView release];

4 构建和运行

【问题讨论】:

你是如何注册didBecomeActiveNotification的? viewdidLoad 内部使用[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActiveNotification:) name:UIApplicationDidBecomeActiveNotification object:nil]; 我试图在 app-delegate 在applicationDidBecomeActive 处显示一个警报,在根视图控制器的didBecomeActiveNotification 处使用您提供的代码注册 - 两者都有效。你认为你的应用有什么特别之处吗,也许是根视图控制器初始化? 我不是说它不工作,它工作正常。我刚刚收到控制台警告,想弄清楚原因。 不幸的是(或者也许幸运的是)我没有看到这样的警告。您能否确认该消息仅在显示警报时可见,而没有警报则没有此类消息?顺便说一句,它真的是编译器警告还是控制台消息? 【参考方案1】:

正如我所说,没有控制台消息,也没有编译器警告。 您能否确认该消息仅在显示警报时可见,而没有警报则没有此类消息?

【讨论】:

是的,只有在显示警报时才会发生。我看到您使用的是模拟器 5.1,而我使用的是 5.0,所以也许这是某种已在 5.1 中修复的错误? @trapper 你可能是对的,我能够再次重现该消息 5.0 Simulator。但好消息是:没有消息再次针对 ios 3.2 和 5.1 devices。我只能在周末之后再次测试 5.0 设备。 在 5.1 模拟器中测试,我也不再有错误。【参考方案2】:

如果不在 didBecomeActiveNotification 中,我应该如何触发我的 UIAlertView?

我会在根视图控制器中触发它。

【讨论】:

根视图控制器并不总是在视图堆栈的顶部。 我已经在 rootViewController 中做了上面的一切【参考方案3】:

您的AppDelegate 无法启动UIAlertViews。这只能由ViewController 完成。

我的一个应用程序中有类似的事情,我想在应用程序启动或激活时检查某些内容,并向用户显示模态viewController

我所做的是创建一个新类,它有一个方法:

+(BOOL)checkIfShouldShowAlert

然后您可以在每个 viewController 的 viewWillAppear 方法中调用此方法,如下所示:

if ([myCheckerClass checkIfShouldShowAlert]) 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle...
    [alertView show];

通过使用单独的类,它可以让您的代码在未来更容易更新!

【讨论】:

我在代理applicationDidBecomeActive中成功创建了警报,你一定是错的。此外,如果您仔细阅读问题,则会在视图控制器中创建警报。 哦!那么在这种情况下 --- 通知“变得活跃”可能已经在视图变得可见时被调用,所以你的 viewController 只是将自己设置为接收者在通知发生之后。我在我的应用程序中使用了一个 NSUserDefault BOOL;我在应用程序关闭之前将其设置为 YES,并且在任何 viewController 第一次调用 myCheckerClass 时设置为 NO 另外:您是否使用故事板?听起来您从未在 AppDelegate 中创建 RootViewController。您的 AppDelegate 应该有一个名为“window”的属性;确保在 applicationDidFinishLaunching 中创建一个 viewController 并将其分配给 AppDelegate 的“window”属性 让我回答你。没有storyboard 的应用程序存在问题,其中创建了UIWindow 并且UIViewController 视图作为窗口的子视图添加到didFinishLaunchingWithOptions。首次启动应用程序的标志是无用的,因为可能会在应用程序启动时显示警报,然后我们就会收到该有线消息。检查该应用程序是否已启动并在viewDidAppear 处显示警报将是多余的。好吧,对我来说会的。

以上是关于UIAlertView 在启动时导致警告消息的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView 给出约束错误

更改 UIAlertView 的背景颜色,我收到警告:未找到 -setContents 方法

如何响应 UIImagePickerController 生成的 UIAlertView

为啥在我的视图被推送到导航堆栈之前我的 UIAlertView 没有在屏幕上消失?

使用 UIAlertView 固定注解

应用访问地图服务时系统弹出UIAlertView,可以更改UIAlertView的消息吗?