Измените RootViewController и Удалите Все Контроллеры Просмотра

#swift

Вопрос:

У меня возникли трудности с заменой контроллера RootViewController в пользовательском классе, который постоянно следит за тем, вошел ли пользователь в систему или нет.

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

  func isLoggedIn () {

        UIApplication.shared.keyWindow?.rootViewController = storyboard.instantiateViewController(withIdentifier: "Main Menu")

    }
 

Комментарии:

1. «Каков наилучший способ, по сути, полностью очистить список и перейти на новый контроллер просмотра?» Что делает один способ лучшим из всех?

2. Давайте начнем с того, что бы вы сделали в этой ситуации?

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

4. @ElTomato «лучший» бит легко игнорируется, не меняя сути вопроса. Я отредактировал его сейчас, чтобы прояснить его и устранить любые опасения, основанные на мнениях.

5. CouchDeveloper; Я не использую контроллер панели вкладок. Это просто сначала показывает вид входа в систему, а затем показывает главное меню. Каким был бы совершенно другой подход?

Ответ №1:

 extension UINavigationController {
/**
 It removes all view controllers from navigation controller then set the new root view controller and it pops.
 
 - parameter vc: root view controller to set a new
 */
func initRootViewController(vc: UIViewController, transitionType type: String = kCATransition, duration: CFTimeInterval = 0.3) {
    self.addTransition(transitionType: type, duration: duration)
    self.viewControllers.removeAll()
    self.pushViewController(vc, animated: false)
    self.popToRootViewController(animated: false)
}

/**
 It adds the animation of navigation flow.
 
 - parameter type: kCATransitionType, it means style of animation
 - parameter duration: CFTimeInterval, duration of animation
 */
private func addTransition(transitionType type: String = kCATransition, duration: CFTimeInterval = 0.3) {
    let transition = CATransition()
    transition.duration = duration
    transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
    transition.type = CATransitionType(rawValue: type)
    self.view.layer.add(transition, forKey: nil)
}}
 

Используйте это

Комментарии:

1. Мое приложение не использует навигационный контроллер… ?

2. Тогда вы должны сохранять состояние входа в систему в Userdefaults. если нет, сохраните его и проверьте при назначении RootViewController

3. Извините, это не решает проблему, связанную с UIWindow. Это не имеет ничего общего с сохранением состояния входа в систему в пользовательских настройках по умолчанию.