Не удается получить приветственный ViewController для отображения только один раз с UserDefaults (Swift)

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

Меня отправляют прямо в ViewController, хотя я пытался стереть весь контент и настройки в симуляторе.

Любые идеи, что я делаю неправильно? Мы будем очень благодарны за любые советы.

Вот код:

AppDelegate под func didFinishLaunchingWithOptions

    self.window = UIWindow(frame: UIScreen.main.bounds)

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    var vc: UIViewController?
    var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

    if ud == true {
        print("This is the user's first visit")
        vc = storyboard.instantiateViewController(withIdentifier: "Welcome_01")
    } else if ud == false {
        print ("This is NOT the user's first visit")
        vc = storyboard.instantiateInitialViewController()!
    }


    self.window?.rootViewController = vc
    self.window?.makeKeyAndVisible()

    return true

Welcome_01 (Добро пожаловать VC)

import UIKit

var isFirstVisit = true

class Welcome_01: UIViewController {

    @IBAction func finishedwelcome(_ sender: Any) {
        isFirstVisit = false
        UserDefaults.standard.set(isFirstVisit, forKey: "UDisFirstVisit")
    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

UIViewController (VC должен отображаться после первого посещения).

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

person CristianMoisei    schedule 03.06.2018    source источник
comment
ud никогда не будет правдой!   -  person matt    schedule 03.06.2018
comment
Хорошо, знаешь почему?   -  person CristianMoisei    schedule 03.06.2018
comment
Что когда-нибудь сделает это правдой? Подумайте о том, что произойдет в самый первый раз. Что будет ud?   -  person matt    schedule 03.06.2018
comment
Это потому, что мой ViewController является начальным VC, поэтому Welcome_01 никогда не загружается, поэтому var isFirstVisit = true никогда не анализируется. Должен ли я затем объявить isFirstVisit в ViewController, а затем в AppDelegate didFinishLaunchingWithOptions?   -  person CristianMoisei    schedule 03.06.2018


Ответы (2)


Просто проследите действие в своем воображении. Что произойдет, когда пользователь впервые запустит приложение?

var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

Что ж, ни одна запись никогда не делалась в пользовательских настройках по умолчанию. Итак, ud — это не true, потому что это ничего — его не существует! Итак, false. Таким образом, ваш приветственный контроллер представления никогда не виден.

Просто переверни свою логику. Начните с вопроса, является ли ключ "UserHasSeenWelcome" false. Если это так, покажите приветствие v.c. и установите ключ на true.

person matt    schedule 03.06.2018
comment
Это имеет смысл, я сделал то, что вы предложили, и это сработало: D. Большое спасибо, Мэтт. - person CristianMoisei; 03.06.2018

Когда приложение устанавливается впервые, ни для одного из ваших ключей UserDefaults нет значений. Итак, когда вы делаете:

var ud = UserDefaults.standard.bool(forKey: "UDisFirstVisit")

на несуществующем ключе UDisFirstVisit вы получите обратно false.

Из документации для bool(forKey:):

Логическое значение, связанное с указанным ключом. Если указанный ключ не существует, этот метод возвращает false.

У вас есть два варианта.

  1. Переверни свою логику. Имейте клавишу UDhasVisited, которая установлена ​​на true, когда вы впервые показываете экран приветствия. При запуске, если это false, показать экран приветствия.
  2. Добавьте следующую строку в свой didFinishLaunchingWithOptions:

    UserDefaults.standard.register(defaults: [ "UDisFirstVisit": true ])
    

Выберите один из двух (не оба).

person rmaddy    schedule 03.06.2018
comment
Переверни свою логику :) - person matt; 03.06.2018