2
votes

Ignorer le contrôleur de vue ne fonctionne pas dans la classe d'assistance Swift

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)    }
}


0 commentaires

5 Réponses :


0
votes
if let topController = UIApplication.topViewController() {
   topController.dismiss(animated: true, completion: nil)
}

3 commentaires

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



1
votes

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.


4 commentaires

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!



0
votes

Vous pouvez changer le rootViewController,

UIApplication.shared.keyWindow?.rootViewController = yourController


2 commentaires

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.



0
votes

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()
    }
}


1 commentaires

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?



1
votes

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.


0 commentaires