2010-04-05 14 views
6

Sto usando il UIAlertView per far apparire una finestra una volta che l'app è stata avviata. Funziona bene ma voglio solo che il pop up appaia al primo avvio dell'app. Al momento ho il UIAlertView nella classe AppDelegate, nel metodo applicationDidFinishLaunching. Ecco il mio codice:Come faccio a visualizzare UIAlertView una sola volta, al primo avvio di un'app per iPhone?

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

Sono nuovo allo sviluppo di app così dispiaciuto se questo è semplice.

risposta

3

Utilizzare un NSUserDefault che è inizialmente impostato su 0 e che viene impostato su 1 dopo aver visualizzato l'avviso per la prima volta.

//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

non è il '' registerDefaults: in più? – zoul

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

Per determinare se l'applicazione viene eseguita per la prima volta, è necessario disporre di una variabile persistente per memorizzare queste informazioni. NSUserDefaults è il modo migliore per memorizzare questi semplici valori di configurazione.

Per esempio,

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

Qui, [defaults boolForKey:@"notFirstRun"] Legge un valore booleano chiamato notFirstRun dal config. Questi valori sono inizializzati su NO. Quindi se questo valore è NO, eseguiamo il ramo if e visualizziamo l'avviso.

Al termine, si utilizza [defaults setBool:YES forKey:@"notFirstRun"] per modificare questo valore booleano su SÌ, quindi il ramo if non verrà mai eseguito di nuovo (si supponga che l'utente non elimini l'app).

1

Come sopra, la soluzione dovrebbe funzionare nella maggior parte dei casi, vorrei tenerla a conoscenza anche in seguito in questo momento.

Documento Apple dice: La classe NSUserDefaults non supporta attualmente le preferenze per host. Per fare ciò, è necessario utilizzare l'API CFPreferences. Rif NSUserDefaults

E una discussione su questo here

2

3 linee semplici

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

Non ci sono problemi in questo, ma puoi usare direttamente bool per impostare il flag. – rptwsthi

+0

Più facile capire che sto lavorando con oggetti NSNumber. Non alcuni valori bool – comonitos

Problemi correlati