Une option consisterait à implémenter votre propre bouton de retour personnalisé. Vous devez ajouter le code suivant à votre méthode viewDidLoad:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
METTRE À JOUR:
Voici la version pour Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
MISE À JOUR 2:
Voici la version pour Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Remplacer le bouton par un bouton personnalisé comme suggéré dans une autre réponse n'est peut-être pas une bonne idée car vous perdrez le comportement et le style par défaut.
Vous pouvez également implémenter la méthode viewWillDisappear sur le contrôleur de vue et rechercher une propriété nommée isMovingFromParentViewController. . Si cette propriété est vraie, cela signifie que le contrôleur de vue disparaît car il est supprimé (sauté).
Devrait ressembler à quelque chose comme:
Dans swift 4.2
la source
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
sera déclenché si vous recevez un appel téléphonique. Ce n'est probablement pas ce que vous voulez. Probablement mieux à utiliserwillMove(toParentViewController:)
la source
parent == nil
est quand nous nous déplaçons de retour à laparent
scèneJ'ai pu y parvenir avec les éléments suivants:
Swift 3
Swift 4
Pas besoin de bouton de retour personnalisé.
la source
J'ai créé cette classe (rapide) pour créer un bouton de retour exactement comme celui normal, y compris la flèche de retour. Il peut créer un bouton avec du texte normal ou avec une image.
Usage
CustomBackButtonClass
(code pour dessiner la flèche arrière créé avec le plugin Sketch & Paintcode)
SWIFT 3.0
la source
Si vous souhaitez avoir un bouton de retour avec une flèche de retour, vous pouvez utiliser une image et un code ci-dessous
backArrow.png [email protected] [email protected]
la source
Si vous utilisez,
navigationController
ajoutez leUINavigationControllerDelegate
protocole à la classe et ajoutez la méthode déléguée comme suit:Cette méthode est appelée chaque fois que le contrôleur de navigation glisse vers un nouvel écran. Si le bouton de retour a été enfoncé, le nouveau contrôleur de vue est
ViewController
lui - même.la source
Dans Swift 5 et Xcode 10.2
Veuillez ne pas ajouter d'élément de bouton de barre personnalisé, utilisez ce comportement par défaut.
Pas besoin de vueWillDisappear , pas besoin de BarButtonItem personnalisé etc ...
Il vaut mieux détecter quand le VC est supprimé de son parent.
Utilisez l'une de ces deux fonctions
Si vous souhaitez arrêter le comportement par défaut du bouton Précédent, ajoutez ensuite BarButtonItem personnalisé.
la source
NON
override func willMove(toParentViewController parent: UIViewController?) { }
Cela sera appelé même si vous vous connectez au contrôleur de vue dans lequel vous remplacez cette méthode. Dans quel cas vérifier si le "
parent
" n'estnil
pas n'est pas un moyen précis pour être sûr de revenir au bonUIViewController
. Pour déterminer exactement si leUINavigationController
navigateur retourne correctement à celuiUIViewController
qui a présenté celui-ci, vous devrez vous conformer auUINavigationControllerDelegate
protocole.OUI
note:
MyViewController
c'est juste le nom de toutUIViewController
ce que vous voulez détecter en remontant.1) En haut de votre fichier, ajoutez
UINavigationControllerDelegate
.2) Ajoutez une propriété à votre classe qui gardera une trace de
UIViewController
celle dont vous faites la succession.3) Dans
MyViewController
laviewDidLoad
méthode de, attribuez leself
rôle de délégué à votreUINavigationController
.3) Avant de vous enchaîner , affectez le précédent
UIViewController
comme propriété.4) Et conforme à une méthode
MyViewController
duUINavigationControllerDelegate
la source
Dans mon cas, le
viewWillDisappear
mieux a fonctionné. Mais dans certains cas, il faut modifier le contrôleur de vue précédent. Voici donc ma solution avec l'accès au contrôleur de vue précédent et cela fonctionne dans Swift 4 :la source
Avant de quitter le contrôleur actuel, je dois montrer une alerte. Je l'ai donc fait de cette façon:
UINavigationController
avecUINavigationBarDelegate
Ça a marché)
la source
Ce n'est pas difficile comme nous le pensons. Créez simplement un cadre pour UIButton avec une couleur d'arrière-plan claire, attribuez une action au bouton et placez-le sur le bouton de retour de la barre de navigation. Et enfin, retirez le bouton après utilisation.
Voici l'exemple de code Swift 3 fait avec UIImage au lieu de UIButton
écrire le code doit être exécuté
Supprimer la sous-vue une fois l'action effectuée
la source
Swift 4.2:
la source
Swift 3:
la source
Essaye ça .
Essayez aussi.
la source
il suffit de contrôler + de faire glisser l'élément de la barre en dessous de func. travailler comme un charme
la source
Vous pouvez sous
UINavigationController
-classer et remplacerpopViewController(animated: Bool)
. En plus de pouvoir y exécuter du code, vous pouvez également empêcher l'utilisateur de revenir en arrière, par exemple pour demander d'enregistrer ou de supprimer son travail actuel.Exemple d'implémentation où vous pouvez définir un
popHandler
qui est défini / effacé par les contrôleurs poussés.Et un exemple d'utilisation à partir d'un contrôleur poussé qui suit le travail non enregistré.
Comme touche agréable, cela sera également appelé
interactivePopGestureRecognizer
lorsque l'utilisateur essaiera de revenir en arrière en faisant un geste de balayage.la source
C'est ma solution
Dans votre contrôleur de vue, vous pouvez gérer comme ceci:
la source
Si je comprends bien , vous voulez vider votre
array
que vous appuyez sur le bouton de retour et de la pop à votre précédenteViewController let
votreArray
qui vous avez chargé sur cet écran estla source
la source
la source
Pour Swift 5 , nous pouvons vérifier que la vue disparaîtra
la source
Swift 5 __ Xcode 11.5
Dans mon cas, je voulais faire une animation, et quand elle a fini, revenir en arrière. Un moyen d'écraser l'action par défaut du bouton de retour et d'appeler votre action personnalisée est le suivant:
Ou vous pouvez utiliser cette méthode une fois pour explorer la hiérarchie des vues NavigationBar et obtenir les index pour accéder à la vue _UIButtonBarButton, transtyper en UIControl, supprimer l'action-cible et ajouter vos actions-cibles personnalisées:
la source
J'ai accompli cela en appelant / en remplaçant
viewWillDisappear
puis en accédant à la pile de ce quinavigationController
suit:la source
Voilà comment je l'ai résolu pour mon propre problème
la source
Voici la solution Swift 5 la plus simple possible qui ne vous oblige pas à créer un bouton de retour personnalisé et à renoncer à toutes les fonctionnalités du bouton gauche UINavigationController que vous obtenez gratuitement.
Comme Brandon A le recommande ci-dessus, vous devez implémenter
UINavigationControllerDelegate
dans le contrôleur de vue avec lequel vous souhaitez interagir avant d'y revenir. Un bon moyen consiste à créer une séquence de déroulement que vous pouvez effectuer manuellement ou automatiquement et réutiliser le même code à partir d'un bouton personnalisé ou du bouton précédent.Tout d'abord, faites de votre contrôleur de vue d'intérêt (celui que vous souhaitez détecter le retour) un délégué du contrôleur de navigation dans son
viewDidLoad
:Deuxièmement, ajoutez une extension au bas du fichier qui remplace
navigationController(willShow:animated:)
Étant donné que votre question comprenait un
UITableViewController
, j'ai inclus un moyen d'obtenir le chemin d'index de la ligne que l'utilisateur a tapée.la source
Vous pouvez faire quelque chose dans votre Viewcontroller comme
Pour une réponse complète, utilisez Détection lorsque le bouton «Retour» est enfoncé sur une barre de navigation
la source