J'ai donc une classe d'aide comme écrit ci-dessous:
func dismiss() {
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
}
Je veux supprimer tous les contrôleurs de vue qui s'ouvrent et reviennent à la racine des applications. Cependant ça ne marche pas. Si je fais la même chose dans le contrôleur de vue ordinaire, cela fonctionne. Quelqu'un connaît la solution? Merci!
Modifier: J'ai déjà essayé cela aussi, mais il a dit que trouvé nul lors de l'encapsulation de la valeur facultative.
class Helper {
static func handleTokenInvalid() {
DispatchQueue.main.async {
UIViewController().dismiss()
}
}
}
extension UIViewController {
func dismiss() {
let root = UIApplication.shared.keyWindow?.rootViewController
root?.dismiss(animated: true, completion: nil) }
}
5 Réponses :
if let topController = UIApplication.topViewController() {
topController.dismiss(animated: true, completion: nil)
}
voyez-vous ce point tous les contrôleurs de vue qui s'ouvrent et reviennent à la racine des applications
Veuillez vérifier quelle réponse est fournie ci-dessous (MCMatan), qui convient plus selon le code fourni par Firda
@Sahzaib Qureshi J'ai fait ça et je ne retourne toujours pas à la racine
Tout ce que vous faites par ce
UIViewController().dismiss
est de créer un nouveau contrôleur de vue et de le rejeter. Vous devez appeler le renvoi sur l'instance de contrôleur View réellement présentée.
Comment faire ça?
Si cela ne fonctionne pas: self.view.window? .RootViewController? .Dismiss (animé: true, complétion: nil) Vous êtes probablement en train de pousser des contrôleurs de vue (via le contrôleur de navigation) et cela devrait fonctionner: self.navigationController? .PopToRootViewController (animé : vrai)
J'ai essayé ça aussi mais ça ne marche pas. Y a-t-il un problème dans le storyboard?
Ce n'est pas répondre, j'ai trouvé une alternative à laquelle je réponds déjà dans cette question. Merci de votre aide!
Vous pouvez changer le rootViewController,
UIApplication.shared.keyWindow?.rootViewController = yourController
cela me donne une erreur Impossible d'attribuer une valeur de type "yourController.Type" au type "UIViewController?"
YourController n'est qu'un exemple de mot, au lieu de remplacer votre instance de contrôleur ici.
Je pense qu'il existe une meilleure solution sans rejeter le contrôleur de vue racine de la fenêtre de l'application actuelle.
Ajoutez un gestionnaire d'achèvement à votre méthode et lorsque vous l'appelez depuis l'intérieur de votre contrôleur, déclarez en conclusion qu'après l'appel de la complétion, vous devez ignorer self (si vous poussez votre contrôleur via UINavigationController , il suffit de le faire apparaître)
class ViewController: UIViewController {
func call() {
Helper.handleTokenInvalid { // this is called when you call `completion` from `handleTokenInvalid`
self.dismiss(animated: true)
//self.navigationController?.popViewController(animated: true)
}
}
}
Ensuite, dans le contrôleur, appelez votre méthode avec le gestionnaire de complétion
static func handleTokenInvalid(completion: @escaping () -> Void) {
DispatchQueue.main.async {
completion()
}
}
J'ai de nombreux contrôleurs dans mon application, je veux donc éviter tout changement dans chaque contrôleur. Est-il possible de licencier en classe d'aide?
Après deux jours, j'ai trouvé la bonne façon de supprimer mon contrôleur et je n'ai pas pu en trouver car je pense que Xcode trouve que mon contrôleur actuel est nul. À la place, j'utilise ceci:
let viewController = UIStoryboard(name: "DashboardPreLogin", bundle: Bundle.main).instantiateViewController(withIdentifier: "TabBarPreLoginViewController")
let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDel.window?.rootViewController = nil
appDel.window?.rootViewController = viewController
UIView.transition(with: appDel.window!, duration: 0.5, options: UIViewAnimationOptions.transitionCrossDissolve, animations: {() -> Void in appDel.window?.rootViewController = viewController}, completion: nil)
Cela supprimera le contrôleur de vue et le remplacera par un nouveau contrôleur.