【问题标题】:UIAlertView causing warning message on startupUIAlertView 在启动时导致警告消息
【发布时间】: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 处使用您提供的代码注册 - 两者都有效。你认为你的应用有什么特别之处吗,也许是根视图控制器初始化?
  • 我不是说它不工作,它工作正常。我刚刚收到控制台警告,想弄清楚原因。
  • 不幸的是(或者也许幸运的是)我没有看到这样的警告。您能否确认该消息仅在显示警报时可见,而没有警报则没有此类消息?顺便说一句,它真的是编译器警告还是控制台消息?

标签: ios xcode uialertview compiler-warnings nsnotifications


【解决方案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 处显示警报将是多余的。好吧,对我来说会的。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-11
相关资源
最近更新 更多