2012-10-14 8 views
11

Ho creato un'applicazione utilizzando Xcode 4.5 con gli storyboard. La prima volta che si avvia l'app, voglio che il controller di visualizzazione iniziale appaia con termini e condizioni che devono essere accettati per procedere. Dopodiché, voglio che l'app si avvii e salti sul primo controller di visualizzazione e vai al secondo.Come posso visualizzare una vista solo al primo avvio?

So che devo usare la classe NSUserDefaults e qualcosa per l'effetto di: if ([[Standard NSUserDefaults ...] boolForKey: @ "iHaveAcceptedTheTerms"])

Ma non ho mai usato questa classe prima e non ho idea di come implementare questo codice. Qualcuno può condividere le specifiche di come farlo?

risposta

10

si mette in nel vostro 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"]; 
} 

Quindi implementare nel rootViewController i termini e le condizioni e un modo per accettarlo. Si dovrà verificare se i termini sono accettati, per esempio come questo:

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

Quando ha accettato, il seguente codice modificherà le impostazioni predefinite:

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

Ok, grazie. Puoi approfondire come ottenere l'app per "procedere normalmente" rispetto a "mostrare i termini"? – jac300

+0

Questo dipende da voi. Ad esempio, la prima volta che l'utente avvia l'app, viene visualizzato viewController (o solo la vista, se si utilizza un singolo VC) che visualizza i termini. Quando i termini sono accettati, lo chiudi e vai al secondo come hai detto. Questo può essere fatto dal root VC come spiegato da alexandresoli. La prossima volta che verrà l'utente, il VC radice mostrerà immediatamente il secondo VC. – NightCoder

+0

Grazie. Sì, capisco il concetto, ma non riesco a capire il codice. Quindi diciamo che i termini sono stati accettati ... come faccio a costruire un codice che dice al programma di "saltare la vista dei termini attuali e andare al prossimo"? In altre parole, guardando il pezzo di codice di alexandresoli: [self presentViewViewer: YOUR_TERMS_CONTROLLER animato: SÌ completamento: nil]; che cos'è "YOUR_TERMS_CONTROLLER", come faccio ad etichettare un controller di visualizzazione e a farvi riferimento in modo programmatico? – jac300

4

Si sarà simile a questa sul tuo primo punto di vista o delegato:

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

Non dimenticate di salvare la risposta degli utenti sul controller termini:

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

Ok, quindi ho inserito il primo blocco di codice nel viewDidLoad del controller di visualizzazione "terms", giusto? Ma poi, come faccio a impostare il nome del controller di visualizzazione ... in altre parole, come faccio a riconoscere il nome di "YOUR_TERMS_CONTROLLER"? – jac300

+0

YOUR_TERMS_CONTROLLER è il controller di visualizzazione visualizzato dopo che l'utente ha accettato i termini. Il punto corretto in cui inserire il codice è all'interno della vista che chiama il tuo controller dei termini, sarà responsabile chiamare i termini o meno. Se hai più dubbi, prova a modificare la tua domanda e inserire del codice. – alexandresoli

12

Nell'interesse di mantenere questa domanda aggiornato, ecco una versione Swift della risposta accettata.


FASE 1

Nella tua App Delegato, aggiungere la seguente funzione.

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

Ciò essenzialmente impostato il tuo TermsAccepted Bool a false se questo è il primo lancio (come Bools sono falsa di default).


FASE 2

Nel vostro controller della vista root (controller della vista che carica al momento del lancio la vostra applicazione), è necessario disporre di un modo per vedere se sono stati accettati i termini o no e agire di conseguenza.

Aggiungere la seguente funzione.

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) 
    } 
} 

FASE 3

Una volta che l'utente accetta le vostre condizioni, si vuole cambiare il vostro TermsAccepted Bool per vero. Quindi nel corpo del metodo che gestisce l'accettazione dei termini, aggiungere la seguente riga.

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

Spero che questo aiuta!

Loic

+0

Funziona perfettamente per me. BTW È importante se chiamo il primo metodo in didFinishLaunchingWithOptions anziché applicationDidFinishLaunching? Votato +1 – CAN

+0

@CAN che dovrebbe funzionare pure! :) –

+0

Ricevo 'Signal SIGABRT' nel mio delegato App. Cosa sta succedendo? –

5

Swift 3 Versione

In AppDelegate.swift:

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

Tenuto radice regolatore:

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

Quando sono stati accettati termini, o tutorial la procedura dettagliata è terminata:

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