如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?

Posted

技术标签:

【中文标题】如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?【英文标题】:How do I make a UIAlertView appear only once, at the first start-up of an iPhone app? 【发布时间】:2010-04-05 14:16:49 【问题描述】:

我正在使用UIAlertView 在应用启动后弹出一个弹出窗口。它工作正常,但我只希望弹出窗口出现在应用程序的第一次启动时。目前我在AppDelegate 类中得到了UIAlertView,在applicationDidFinishLaunching 方法中。这是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     
sleep(4);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Welcome!" message:@"SAMPLE!!!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
[alert release];

我是应用程序开发的新手,如果这很简单,很抱歉。

【问题讨论】:

【参考方案1】:

要确定应用程序是否第一次运行,您需要有一个持久变量来存储此信息。 NSUserDefaults 是存储这些简单配置值的最佳方式。

例如,

-(BOOL)application:(UIApplication *)application … 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
    if (! [defaults boolForKey:@"notFirstRun"]) 
      // display alert...
      [defaults setBool:YES forKey:@"notFirstRun"];
    
    // rest of initialization ...

这里,[defaults boolForKey:@"notFirstRun"] 从配置中读取一个名为 notFirstRun 的布尔值。这些值被初始化为 NO。所以如果这个值为 NO,我们执行if 分支并显示警报。

完成后,我们使用[defaults setBool:YES forKey:@"notFirstRun"]将此布尔值更改为YES,因此if分支将永远不会再次执行(假设用户没有删除应用程序)。

【讨论】:

【参考方案2】:
- (void) displayWelcomeScreen

    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSString *alreadyRun = @"already-run";
    if ([prefs boolForKey:alreadyRun])
        return;
    [prefs setBool:YES forKey:alreadyRun];
    UIAlertView *alert = [[UIAlertView alloc]
        initWithTitle:@"…"
        message:@"…"
        delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
    [alert show];
    [alert release];

【讨论】:

【参考方案3】:

使用最初设置为 0 的 NSUserDefault,您在第一次显示警报后设置为 1。

//default value is 0
[settings registerDefaults:[NSDictionary dictionaryWithObject:[NSNumber numberWithInt:0] forKey:@"HAVE_SHOWN_REMINDER"]];
    BOOL haveShownReminder = [settings boolForKey:@"HAVE_SHOWN_REMINDER"];  
    if (!haveShownReminder)

    //show your alert

    //set it to 1
    [[NSUserDefaults standardUserDefaults]  setObject:[NSNumber numberWithInt:1] forKey:@"HAVE_SHOWN_REMINDER"];    

【讨论】:

registerDefaults: 不是多余的吗?【参考方案4】:

简单的3行

-(BOOL)application:(UIApplication *)applicationBlahBlah 
    if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"NOT_FIRST_TIME"] boolValue])
    
        [[[[UIAlertView alloc] initWithTitle:nil message:@"message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] autorelease] show];
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"NOT_FIRST_TIME"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    

【讨论】:

这样做没有问题,但是你可以直接使用bool来设置flag。 更容易意识到我正在使用 NSNumber 对象。不是一些布尔值【参考方案5】:

由于上述解决方案在大多数情况下都应该有效,所以我想在这个时间点让您了解以下内容。

Apple 文档说:NSUserDefaults 类目前不支持每个主机的首选项。为此,您必须使用 CFPreferences API。参考NSUserDefaults

还有关于这个here的讨论

【讨论】:

以上是关于如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIAlertView iPhone 中添加 TextView 320*460

如何在 iPhone 应用程序的不同文件中为 UIAlertview 设置委托

iPhone App 中的 UIAlertView 动态

iphone:UIAlertView 不会消失并阻止 UIProgressView

UIAlertView里面的UIView

如何更改 UIAlertView 按钮的宽度?