Как представить экран входа в систему только тогда, когда ключ userdefaults не существует?

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

Затем токен доступа сохраняется в пользовательских настройках по умолчанию, а затем представляет новый контроллер представления, который дает доступ к защищенным данным.

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

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

Как бы я идеально справился с этим, это тот случай, когда начальный контроллер представления установлен на защищенный контроллер представления, когда существует ключ пользователя по умолчанию, но при этом, как бы я обрабатывал функцию выхода из системы, поскольку мне нужно было бы «вытолкнуть» в корневой вид контроллер и очистить пользовательские настройки по умолчанию, но, поскольку экран входа в систему отсутствует в иерархии представлений, я не могу вернуться к этому? Если он представил контроллер представления входа в систему при выходе из системы, то защищенный контроллер представления все еще существует под контроллером представления входа.

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

Спасибо


person Michael    schedule 26.01.2017    source источник
comment
@Michael, я пишу демо и публикую основной код ниже, на который вы можете ссылаться. Если вы хотите демо, оставьте свой адрес электронной почты здесь.   -  person aircraft    schedule 26.01.2017


Ответы (1)


Вам просто нужно в методе Appdelegate.swift application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) судить.

Но предварительным условием является ручное управление окном:

Удалите эту строку в своем info.plist: введите здесь описание изображения

Затем в вашем AppDelegate.swift вы можете установить свое окно вручную:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

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

    let sb:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)

    let isLogin:Bool = UserDefaults.standard.bool(forKey: "isLogin")
    if isLogin {

        let vc2 = sb.instantiateViewController(withIdentifier: "ViewController2")

        self.window?.rootViewController = vc2
    }else {
        let vc1 = sb.instantiateViewController(withIdentifier: "ViewController")
        self.window?.rootViewController = vc1
    }

    self.window?.makeKeyAndVisible()

    return true
}

И в вашем ViewController.swift (вы можете рассматривать его как LoginVc):

override func viewDidLoad() {
    super.viewDidLoad()

    /* add userdefaults */

    UserDefaults.standard.set(true, forKey: "isLogin")
    UserDefaults.standard.synchronize()

}
person aircraft    schedule 26.01.2017
comment
Спасибо @aircraft, что имеет смысл, что вы делаете, однако, как бы я благодарил за обработку входа/выхода из системы, поскольку после входа пользователя в систему мне нужно было бы избавиться от контроллера входа в систему, чтобы сэкономить память, а также при выходе из системы мне нужно было бы избавиться от всех других контроллеров представления и просто оставить контроллер представления входа в иерархию? - person Michael; 26.01.2017
comment
@Michael, вы можете просто установить rootViewController для входа в систему vc - person aircraft; 26.01.2017
comment
Я мог бы попробовать, вытолкнет ли это все остальные из стека, оставив контроллер входа в систему? - person Michael; 26.01.2017
comment
если в вашем коде нет проблем с памятью. остальные ссылки vc станут нулевыми. - person aircraft; 26.01.2017
comment
Ах, я вижу, поэтому установка rootviewcontroller напрямую приведет к аннулированию всех других активных контроллеров представления? - person Michael; 26.01.2017