Как я могу показать представление только при первом запуске?

Я построил приложение, используя Xcode 4.5 с раскадными версиями. При первом запуске приложения я хочу, чтобы контроллер начального представления отображался с условиями, которые должны быть приняты для продолжения. После этого я хочу, чтобы приложение запускалось и пропускало первый контроллер представления и переходило ко второму.

Я знаю, что мне нужно использовать класс NSUserDefaults и что-то вроде:     if ([[NSUserDefaults standard...] boolForKey: @ "iHaveAcceptedTheTerms" ])

Но я никогда раньше не использовал этот класс и не знаю, как реализовать этот код. Может ли кто-нибудь поделиться спецификой того, как это сделать?

Ответ 1

Вы добавили свой 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"];
}

Затем вы внедряете в свой rootViewController условия и способ их принятия. Вам нужно будет проверить, принимаются ли условия, например:

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

Приняв следующий код, вы измените настройки по умолчанию:

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

Ответ 2

В интересах поддержания актуальности этого вопроса, вот версия принятого ответа Swift.


ШАГ 1

В своем делеге приложения добавьте следующую функцию.

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

По умолчанию этот параметр будет установлен в false, если это первый запуск (по умолчанию Bools false).


ШАГ 2

В вашем контроллере корневого представления (контроллер просмотра, который загружается при запуске вашего приложения), у вас должен быть способ увидеть, были ли условия приняты или нет и действуют соответственно.

Добавьте следующую функцию.

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

ШАГ 3

После того, как пользователь примет ваши условия, вы хотите изменить TermsAccepted Bool на true. Таким образом, в теле метода, который обрабатывает принятие условий, добавьте следующую строку.

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

Надеюсь, это поможет!

Лоик

Ответ 3

версия Swift 3

В AppDelegate.swift:

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

В контроллере корневого представления:

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

Когда условия приняты или завершено учебное пошаговое руководство:

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

Ответ 4

Это будет выглядеть так, как показано на первом представлении или делегировании:

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

Не забывайте сохранять ответ пользователя на контроллере терминалов:

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