¿Cómo puedo mostrar una vista solo en el primer lanzamiento?

Creé una aplicación usando Xcode 4.5 con guiones gráficos. La primera vez que se inicia la aplicación, deseo que aparezca el controlador de vista inicial con los términos y condiciones que deben aceptarse para continuar. Después de eso, quiero que la aplicación se inicie y omita el primer controlador de vista y vaya al segundo.

Sé que tengo que usar la clase NSUserDefaults y algo en el sentido de: if ([[NSUserDefaults standard …] boolForKey: @ “iHaveAcceptedTheTerms”])

Pero nunca antes había usado esta clase y no tengo idea de cómo implementar este código. ¿Alguien puede compartir los detalles de cómo hacer esto?

Usted ingresó en su AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //first-time ever defaults check and set if([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]!=YES) { [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"TermsAccepted"]; } 

Luego implementa en su raíz ViewController los términos y condiciones y una forma de aceptarlo. Deberá verificar si los términos son aceptados, por ejemplo, de esta manera:

 if ([[NSUserDefaults standardUserDefaults] boolForKey:@"TermsAccepted"]){ //proceed with app normally } else{ //show terms } 

Cuando se acepte, el siguiente código cambiará la configuración predeterminada:

  if(termsaccepted){ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"TermsAccepted"]; } 

En aras de mantener esta pregunta actualizada, aquí hay una versión Swift de la respuesta aceptada.


PASO 1

En su delegado de la aplicación , agregue la siguiente función.

 func applicationDidFinishLaunching(application: UIApplication) { if !NSUserDefaults.standardUserDefaults().boolForKey("TermsAccepted") { NSUserDefaults.standardUserDefaults().setBool(false, forKey: "TermsAccepted") } } 

Esto esencialmente establecerá Boos Aceptados por Términos en falso si este es el primer lanzamiento (ya que los Bools son falsos por defecto).


PASO 2

En su controlador de vista raíz (el controlador de vista que se carga cuando se inicia su aplicación), debe tener una forma de ver si los términos han sido aceptados o no y actuar en consecuencia.

Agregue la siguiente función.

 override func viewDidAppear(animated: Bool) { if NSUserDefaults.standardUserDefaults().boolForKey("TermsAccepted") { // Terms have been accepted, proceed as normal } else { // Terms have not been accepted. Show terms (perhaps using performSegueWithIdentifier) } } 

PASO 3

Una vez que el usuario acepta sus condiciones, quiere cambiar su Boole de TermsAccepted por verdadero . Entonces, en el cuerpo del método que maneja la aceptación de los términos, agregue la siguiente línea.

 NSUserDefaults.standardUserDefaults().setBool(true, forKey: "TermsAccepted") 

¡Espero que esto ayude!

Loic

Versión de Swift 3

En AppDelegate.swift:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { if !UserDefaults.standard.bool(forKey: "Walkthrough") { UserDefaults.standard.set(false, forKey: "Walkthrough") } } 

En el controlador de vista raíz:

 override func viewDidLoad() { super.viewDidLoad() if UserDefaults.standard.bool(forKey: "Walkthrough") { // Terms have been accepted, proceed as normal } else { // Terms have not been accepted. Show terms (perhaps using } } 

Cuando los términos han sido aceptados, o el tutorial finaliza:

 UserDefaults.standard.set(true, forKey: "Walkthrough") 

Se verá así en su primera vista o delegado:

 NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]; BOOL isAccepted = [standardUserDefaults boolForKey:@"iHaveAcceptedTheTerms"]; if (!isAccepted) { [self presentViewController:YOUR_TERMS_CONTROLLER animated:YES completion:nil]; } else { [self.navigationController pushViewController:YOUR_NORMAL_CONTROLLER animated:YES]; } 

No te olvides de guardar la respuesta del usuario en tu controlador de términos:

 [standardUserDefaults setBool:YES forKey:@"iHaveAcceptedTheTerms"];