Не удается получить приветственный ViewController для отображения только один раз с UserDefaults (Swift) - PullRequest
0 голосов
/ 03 июня 2018

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

Я отправляюсь прямо в 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 (приветственный ВК)

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 (ВК должен отображаться после первого посещения).

class ViewController: UIViewController {

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

}

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

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

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

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

Просто измените логику.Начните с вопроса, является ли ключ "UserHasSeenWelcome" ложным .Если это так, покажите приветственный vc и установите ключ на true.

0 голосов
/ 03 июня 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 ])
    

Pickодин из двух (не оба).

...