Вы должны всегда выполнять отмену всех модальных типов при замене rootViewController, в противном случае будет сохранен цикл.
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
Если вы хотите сделать хороший переход,Вы всегда можете обернуть его в анимацию:
func transition() {
if window?.rootViewController.presentedViewController != nil {
window?.rootViewController.dismiss?(animated: false) {
window?.rootViewController = newViewController
}
}
else {
window?.rootViewController.dismiss?(animated: false)
window?.rootViewController = newViewController
}
}
UIView.transition(with: window!,
duration: 0.3,
options: .transitionCrossDissolve,
animations: transition)