2010-04-05 127 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

相關問題