【问题标题】:How do I make a UIAlertView appear only once, at the first start-up of an iPhone app?如何让 UIAlertView 在 iPhone 应用程序第一次启动时只出现一次?
【发布时间】: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];

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

【问题讨论】:

    标签: iphone cocoa-touch xcode uialertview


    【解决方案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的讨论

        【讨论】:

          猜你喜欢
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          • 2019-06-04
          • 2020-07-05
          • 2015-05-01
          • 2011-11-13
          相关资源
          最近更新 更多