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.0Simulator
。但好消息是:没有消息再次针对 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 的背景颜色,我收到警告:未找到 -setContents 方法
如何响应 UIImagePickerController 生成的 UIAlertView