2017-01-26 2 views
1

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

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

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

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

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

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

Благодаря

+0

@ Майкл, я пишу демоверсию и размещаю основной код ниже, на который вы можете ссылаться. Если вы хотите демонстрацию, оставьте свой адрес электронной почты здесь. – aircraft

ответ

2

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

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

Удалить эту строку в вашем info.plist: enter image description here

Тогда в вашем 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() 

} 
+0

Спасибо @aircraft, что имеет смысл, что вы делаете, однако как я могу поблагодарить ручку login/logout, как только пользователь вошел в систему Мне нужно было бы избавиться от контроллера входа в систему, чтобы сохранить память, а также при выходе из системы мне понадобится чтобы избавиться от всех других контроллеров представлений и просто оставить контроллер входа в систему в иерархии? – Michael

+0

@ Майкл, вы можете просто установить rootViewController на вход vc – aircraft

+0

Я мог бы попробовать, будет ли выходить все остальные из стека, оставляя контроллер входа? – Michael

Смежные вопросы