2010-04-05 48 views
6

我使用UIAlertView在应用程序启动后弹出窗口。它工作正常,但我只想弹出窗口出现在应用程序的第一次启动。目前我已经在AppDelegate类中获得UIAlertView,在applicationDidFinishLaunching方法中。这里是我的代码:如何在iPhone应用第一次启动时使UIAlertView只出现一次?

- (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]; 

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

回答

3

使用NSUserDefault,它最初设置为0,并在第一次显示警报后将其设置为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"];  
} 
+1

的讨论是不是'registerDefaults:'多余? – zoul 2010-04-05 14:35:14

4
- (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]; 
} 
10

要确定应用是否第一次运行时,你需要有一个持久的变量来存储这些信息。 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分支永远不会再次执行(假定用户不会删除应用程序)。

1

由于上述解决方案应该在大多数情况下都能正常工作,所以我希望在下文中及时了解您的情况。

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

并在此here

2

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]; 
    } 
} 
+0

这样做没有问题,但您可以直接使用bool设置标志。 – rptwsthi 2013-02-20 14:50:24

+0

更容易意识到我正在处理NSNumber对象。不是一些布尔值 – comonitos 2013-02-20 15:00:56

相关问题