2010-04-05 16 views
6

Estoy usando el UIAlertView para hacer que aparezca una ventana emergente una vez que la aplicación se haya iniciado. Funciona bien, pero solo quiero que la ventana emergente aparezca en la primera puesta en marcha de la aplicación. En este momento tengo el UIAlertView en la clase AppDelegate, en el método applicationDidFinishLaunching. Aquí está mi código:¿Cómo hago que un UIAlertView aparezca solo una vez, en la primera puesta en marcha de una aplicación de 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]; 

Soy nuevo en el desarrollo de aplicaciones lo siento si esto es simple.

Respuesta

3

Utilice NSUserDefault que inicialmente se establece en 0 y que establece en 1 después de mostrar la alerta por primera vez.

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

no es el '' registerDefaults: extra? – 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

Para determinar si la aplicación se ejecuta por primera vez, es necesario tener una variable persistente para almacenar esta información. NSUserDefaults es la mejor manera de almacenar estos valores de configuración simple.

Por ejemplo,

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

Aquí, [defaults boolForKey:@"notFirstRun"] lee un valor booleano llamado notFirstRun de la configuración. Estos valores se inicializan a NO. Entonces, si este valor es NO, ejecutamos la rama if y mostramos la alerta.

Después de hacerlo, utilizamos [defaults setBool:YES forKey:@"notFirstRun"] para cambiar este valor booleano a SÍ, por lo que la rama if nunca se ejecutará nuevamente (suponiendo que el usuario no elimine la aplicación).

1

Como la solución anterior debería funcionar en la mayoría de los casos, me gustaría mantenerlo informado también a continuación en este momento.

El documento de Apple dice: La clase NSUserDefaults no admite actualmente las preferencias por host. Para hacer esto, debe usar la API CFPreferences. Ref NSUserDefaults

Y una discusión sobre este here

2

3 líneas simples

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

No hay problemas al hacer esto, pero puede usar bool directamente para configurar el indicador. – rptwsthi

+0

Es más fácil darse cuenta de que estoy trabajando con objetos NSNumber. No algunos valores bool – comonitos

Cuestiones relacionadas