J'utilise un storyboard et j'ai 3 VC. Quand je suis sur VC3, j'aimerais que le bouton retour ignore VC2 et passe à VC1.
J'ai essayé ce qui suit qui fonctionne mais VC2 clignote avant d'arriver à VC1
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "arrow_back")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "arrow_back")
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: #selector(self.backPressed(_:)))
self.navigationController?.navigationBar.barStyle = .black
}
@objc func backPressed(_ sender: Any){
print("here")
self.navigationController?.popToRootViewController(animated: false)
}
Mon back code personnalisé:
override func viewWillDisappear(_ animated: Bool) {
self.navigationController?.popViewController(animated: true)
}
3 Réponses :
changement dans viewDidLoad
@objc func backPressed(_ sender: Any){
let controllerToBeReached = navigationController!.viewControllers.filter { $0 is YourViewController }.first!
navigationController!.popToViewController(controllerToBeReached, animated: true)
}
Ajouter si vous voulez aller au tout premier contrôleur, utilisez
@objc func backPressed(_ sender: Any){
self.navigationController?.popToRootViewController(animated: true)
}
et si ce n'est pas le premier contrôleur de vue dans le contrôleur de navigation
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.isTranslucent = true
self.navigationController?.navigationBar.backIndicatorImage = UIImage(named: "arrow_back")
self.navigationController?.navigationBar.backIndicatorTransitionMaskImage = UIImage(named: "arrow_back")
var backButton = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(backPressed(_:)))
navigationController?.navigationBar.topItem?.backBarButtonItem = backButton
self.navigationController?.navigationBar.barStyle = .black
}
p >
Dois-je toujours utiliser la fonction viewWillDisappear? override func viewWillDisappear (_ animated: Bool) {self.navigationController? .popToRootViewController (animated: true)} Cela crée toujours une animation vers VC2 avant d'arriver à VC1. Dois-je utiliser autre chose pour déclencher ce bouton de retour?
pourquoi faire dans viewWillDisappear? Vous devriez faire mon code en action du bouton de retour du contrôleur de navigation
Est-ce fait ici? self.navigationItem.backBarButtonItem = UIBarButtonItem (titre: "", style: .plain, cible: nil, action: nil)
Sur UIBarButtonItem (titre: "", style: .plain, target: nil, action: #selector (self.backPressed (:))) J'obtiens l'erreur (1) Expression attendue dans la liste des expressions (2) Argument manquant pour le paramètre # 1 en appel. Sur @objc func backPressed (_ sender: Any) {self.navigationController? .PopToRootViewController} J'obtiens l'erreur (1) L'expression se résout en une fonction inutilisée
mettez _ avant: ... deux points et l'erreur disparaîtra
Utilisez comme ceci self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: nil, action: #selector (self.backPressed (_ :)))
désolé pour la gêne occasionnée.
Cela a résolu l'erreur mais toujours une erreur (1) L'expression se résout en une fonction inutilisée sur @objc func backPressed (_ sender: Any) {self.navigationController? .PopToRootViewController}
à nouveau mis à jour ma réponse je ne sais pas ce qui se passe avec moi cela devrait être self.navigationController? .popToRootViewController (animé: true)
Aucune erreur merci. J'ai placé une impression ("test") à l'intérieur de backPressed () mais cela ne la déclenche pas.
Je pense que c'est parce que j'ai un bouton personnalisé: self.navigationController? .NavigationBar.backIndicatorImage = UIImage (nommé: "arrow_back") self.navigationController? .NavigationBar.backIndicatorTransi tionMaskImage = UIImage (nommé: "arrow_back")
vous devez publier un code complet dans cette condition car il y a plusieurs choses sur votre code que nous ne savons pas ...
Encore une fois, essayez de le faire avec la cible définie sur self trop self.navigationItem.backBarButtonItem = UIBarButtonItem (title: "", style: .plain, target: self, action: #selector (self.backPressed (_ :)))
J'ai ajouté le viewDidLoad complet avec votre code dans le message d'origine.
Pouvez-vous s'il vous plaît accepter et voter pour que d'autres le trouvent utile :) s'ils en ont besoin aussi :)
Salut Abu, j'ai donc essayé l'autre option, pour passer à un NV / VC précédent mais le code ne fonctionne pas. @objc func backPressed (_ sender: Any) {//self.navigationController?.popToRootViewController(animate d: true) let UserNav = navigationController! .viewControllers.filter {$ 0 est UserDashboardVC} .first!; navigationController! .popToViewController! .popToView (UserNav, animated: true)} J'ai vérifié mon nom NC "UserNav" et mon nom VC UserDashboardVC. J'obtiens un Thread 1: Erreur fatale: trouvé nul de manière inattendue lors du déballage d'une valeur facultative
Si vous ne voulez pas voir VC2 flashé avant que VC1 n'apparaisse, et si VC1 est la racine, définissez simplement animated = false
Remplacez l'action de votre VC3 puis utilisez ceci: self.navigationController? .popToRootViewController (animé: false)
Dans le bouton de retour de votre code Exécutez automatiquement popToViewController avant l'appel de la méthode viewWillDisappear afin que vous clignotiez sur VC2
Dans VC3 ajouter Retour BarButtonitem pour effectuer une action pour aller à VC3 à VC1
@objc func back(sender: UIBarButtonItem) {
let vc = VC1()
self.navigationController.popToViewController(vc, animated: true)
}
Voici la méthode de retour UIBarButtonItem
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let customBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItem.Style.plain, target: self, action: #selector(back))
self.navigationItem.leftBarButtonItem = customBackButton
}
Cela fonctionne mais tue mon bouton de retour personnalisé. self.navigationController? .navigationBar.backIndicatorImage = UIImage (nommé: "arrow_back") self.navigationController? .navigationBar.backIndicatorTransi tionMaskImage = UIImage (nommé: "arrow_back")
si vous voulez utiliser l'image dans le bouton Précédent, utilisez UIBarButtonItem (image: UIImage (nommé: "arrow_back"), style: .plain, target: self, action: #selector (backPressed (_ :)))
vous n'avez pas besoin d'utiliser backIndicatorImage ou backIndicatorTransitionMaskImage dans car nous utilisons UIBarButtonItem navigationBar.
essayez d'utiliser navigationController? .popToRootViewController (animated: true) lorsque vous appuyez de nouveau dans VC3.
Utilisez une séquence de déroulement
Comment poussez-vous
VC3? Utilisation de storyboard segue?@Vikky comment attribuer ce morceau de code à mon bouton de retour?
Écrivez simplement le code dans @IBAction du bouton de retour dans votre VC3. Mais je pense que vous utilisez segue ?.
@ Paulw11 Je ne peux pas sélectionner le bouton de retour sur mon VC pour quitter, il sélectionne la barre de navigation complète.
Vous devrez utiliser un bouton de retour personnalisé et le lier à la séquence de déroulement.
@RajeshKumarR VC1 à VC2 est un bouton dans la NavBar, VC2 à VC3 est un bouton et les deux segments sont show / push.
@Vikky C'est la chose étrange, je ne peux pas sélectionner le bouton Retour dans ma NavBar pour faire glisser une IBAction, il sélectionne la NavBar complète.
@ Paulw11 pouvez-vous nous aider avec le code du bouton personnalisé arrière pour dérouler la séquence?
La réponse ci-dessous vous donne le code pour créer le bouton. Vous devez créer une fonction
@IBAction func unwind (_ segue: UIStoryboardSegue)dans le contrôleur de vue vers lequel vous souhaitez vous connecter (il n'y a pas de code dans cette fonction). Puis ctrl-faites glisser depuis le contrôleur de vue vers l'icône "sortie" dans le storyboard et sélectionnezdérouler:. Donner un identifiant à la séquence Vous pouvez maintenant simplementperformSegue ()cette séquence à dérouler. Ceci est un peu obsolète car il utilise Objective- C mais le processus de base est le même@ Paulw11 J'utilise déjà le VC pour quitter segue car mon VC a une table et il est utilisé pour se dérouler en VC1 lorsqu'une ligne est sélectionnée.
D'accord. Donc, tout ce que vous avez à faire est de déclencher cette transition à partir de votre bouton de retour personnalisé
@ Paulw11 Quelque chose comme ça? self.navigationItem.backBarButtonItem = UIBarButtonItem (titre: "", style: .plain, cible: nil, action: #selector (self.backPressed (_ :)))
Oui et dans
backPressedvous effectuez simplement la séquence de déroulement.