#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. Это не имеет ничего общего с сохранением состояния входа в систему в пользовательских настройках по умолчанию.