2012-10-14 11 views
11

Zbudowałem aplikację przy użyciu Xcode 4.5 z storyboardami. Przy pierwszym uruchomieniu aplikacji chcę, aby początkowy kontroler widoku pojawiał się z warunkami, które muszą zostać zaakceptowane, aby kontynuować. Następnie chcę, aby aplikacja uruchomiła się i pominęła pierwszy kontroler widoku i przejdź do drugiego.Jak wyświetlić widok przy pierwszym uruchomieniu?

wiem, że muszę użyć klasy NSUserDefaults i coś do skutku: if ([[norma NSUserDefaults ...] boolForKey: @ "iHaveAcceptedTheTerms"])

Ale ja nigdy nie używane do tej klasy wcześniej i nie mam pojęcia, jak zaimplementować ten kod. Czy ktoś może podzielić się szczegółami tego, jak to zrobić?

Odpowiedz

10

włożysz w 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"]; 
} 

Następnie wdrażasz w swoim rootViewController warunki i sposób ich akceptowania. Trzeba będzie sprawdzić, czy warunki są akceptowane, na przykład tak:

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

Kiedy akceptowane, następujący kod spowoduje zmianę ustawień domyślnych:

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

Ok dzięki. Czy możesz dowiedzieć się, jak sprawić, by aplikacja "normalnie postępowała", a nie "wyświetlała warunki"? – jac300

+0

To zależy od Ciebie. Na przykład, po raz pierwszy użytkownik uruchamia aplikację, wyświetla się viewController (lub tylko widok, jeśli używasz pojedynczego VC) wyświetlającego warunki. Kiedy warunki są akceptowane, zamykasz je i przechodzisz do drugiego, o czym wspomniałeś. Można to zrobić za pomocą głównego VC, jak wyjaśniono w alexandresoli. Następnym razem, gdy użytkownik przyjdzie, główny VC natychmiast wyświetli drugi VC. – NightCoder

+0

Dzięki. Tak, rozumiem tę koncepcję, ale nie mogę wymyślić kodu. Powiedzmy, że warunki zostały zaakceptowane ... w jaki sposób mogę skonstruować kod, który mówi programowi, aby "pomijał bieżący widok warunków i przechodził do następnego"? Innymi słowy, patrząc na fragment kodu alexandresoli: [self presentViewController: YOUR_TERMS_CONTROLLER animowany: TAK ukończenie: nil]; co to jest "YOUR_TERMS_CONTROLLER", jak mam oznaczyć kontroler widoku i programowo go odnieść? – jac300

4

będzie to wyglądać tak na pierwszy rzut oka lub delegata:

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

nie zapomnij zapisać odpowiedzi użytkownika na kontrolerze warunkach:

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

Ok, więc umieściłem pierwszy blok kodu w viewDidLoad kontrolera widoku "warunki", czy to prawda? Ale jak ustawić nazwę kontrolera widoku ... innymi słowy, jak mogę go rozpoznać po nazwie "YOUR_TERMS_CONTROLLER"? – jac300

+0

YOUR_TERMS_CONTROLLER to kontroler widoku, który pojawia się po zaakceptowaniu przez użytkownika warunków. Prawidłowe miejsce do umieszczenia kodu znajduje się w widoku, który wywołuje kontroler warunków, będzie odpowiedzialny za wywoływanie warunków lub nie. Jeśli masz więcej wątpliwości, spróbuj edytować swoje pytanie i wpisz kod. – alexandresoli

12

W trosce o utrzymanie to pytanie aktualne, tutaj jest Swift wersja zaakceptowanej odpowiedzi.


KROK 1

W swojej App Delegata, dodaj następującą funkcję.

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

To będzie zasadniczo ustawić TermsAccepted Bool false, jeśli jest to pierwsze uruchomienie (jak Bools są fałszywy domyślnie).


KROK 2

W kontrolerze widoku głównym (kontrolera widoku, który ładuje, gdy aplikacja jest uruchomiona), trzeba mieć sposób, aby sprawdzić, czy warunki zostały zaakceptowane, czy nie i akt odpowiednio.

Dodaj następującą funkcję.

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

KROK 3

Gdy użytkownik akceptuje swoje warunki, chcesz zmienić TermsAccepted Bool do prawdziwej. Tak więc w treści metody, która obsługuje akceptację warunków, dodaj następującą linię.

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

Mam nadzieję, że to pomoże!

Loic

+0

To działa idealnie dla mnie. BTW Czy ma znaczenie, czy wywołać pierwszą metodę w didFinishLaunchingWithOptions zamiast applicationDidFinishLaunching? Wzniesiony +1 – CAN

+0

@CAN, który również powinien działać! :) –

+0

Otrzymuję 'Signal SIGABRT' w mojej aplikacji Delegat. Co się dzieje? –

5

Swift 3 Wersja

W AppDelegate.swift:

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

W głównym widoku kontrolera:

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

Kiedy warunki zostały zaakceptowane, lub poradnik zakończono:

UserDefaults.standard.set(true, forKey: "Walkthrough") 
Powiązane problemy