vérification des données avant de quitter la vue via le bouton Retour dans la barre de navigation dans Swift iOS

carlson

J'ai configuré une application pour iOS (iPad) avec différentes vues en tant que vue fractionnée dans Xcode 12. Les pages individuelles sont liées via la barre de navigation.

Dans une vue, j'ai la possibilité de saisir des données, qui peuvent être stockées via un bouton dédié. Cependant, il est toujours possible de quitter la vue via le bouton de retour dans la barre de navigation sans avoir préalablement enregistré les données modifiées.

Par conséquent, je souhaite vérifier avant de quitter la vue via le bouton de retour, s'il y a encore des modifications de données non enregistrées et si oui, je veux demander à l'utilisateur si ces modifications doivent être stockées via un UIAlert-Dialogue.

La configuration de ce UIAlertDialogue dans la vueWillDisappear() ne fonctionne pas car la vue est trop tard.

Par conséquent, j'ai essayé de les gérer via une définition de substitution de navigationItem.backBarButtonItem dans viewDidLoad(). Mais cela ne fonctionne pas non plus - voir le code :

import UIKit

classe ViewController : UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.navigationItem.backBarButtonItem!.target = self
        self.navigationItem.backBarButtonItem!.action = #selector(checkDataChange)
    }


    
    @objc func checkDataChange() {
        if unsavedData {
            let checkSaving = UIAlertController(title: "Unsaved data", message: "Do you want to store them?", preferredStyle: .alert)
            let saveChanges = UIAlertAction(title: "Yes", style: .default) {(alertAction) in self.saveChanges()}
            let discardChanges = UIAlertAction(title: "No", style: .default) {(alertAction) in self.closeView()}
            checkSaving.addAction(saveChanges)
            checkSaving.addAction(discardChanges)
            self.present(checkSaving, animated: false, completion: nil)
       }

            
    }

Pouvez-vous m'aider s'il vous plaît, qu'est-ce que je dois changer pour que cela fonctionne? Merci pour votre précieux soutien.

Mahendra

Vous pouvez ajouter un bouton de barre personnalisé dans le contrôleur de navigation.

Bouton de barre de recul pour le contrôleur de vue...

func setBackButton() {
    let btnBack = UIButton(type: .custom)
    btnBack.frame = CGRect(x: 0, y: 0, width: 30, height: 25)
    btnBack.setImage(UIImage(named: "arrow_back"), for: .normal)
    btnBack.addTarget(self, action: #selector(btnBackTapped), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: btnBack)
}

Rajouter la méthode de sélection btn

@objc func btnBackTapped() {
    //show user an alert for the unsaved data or you can pop/dismiss the view controller
}

J'ai créé une extension...

extension UIViewController {

 var isModal: Bool {

    let presentingIsModal = presentingViewController != nil
    let presentingIsNavigation = navigationController?.presentingViewController?.presentedViewController == navigationController
    let presentingIsTabBar = tabBarController?.presentingViewController is UITabBarController

    return presentingIsModal || presentingIsNavigation || presentingIsTabBar
  }

//----------------------------------------------------------

  func setBackButton() {
    let btnBack = UIButton(type: .custom)
    btnBack.frame = CGRect(x: 0, y: 0, width: 30, height: 25)
    btnBack.setImage(UIImage(named: "arrow_white"), for: .normal)
    btnBack.addTarget(self, action: #selector(btnBackTapped), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: btnBack)
  }

//----------------------------------------------------------

  @objc func btnBackTapped() {
    if !isModal {
        navigationController?.popViewController(animated: true)
    } else {
        dismiss(animated: true, completion: nil)
    }
  }
}

Vous pouvez utiliser l'extension ci-dessus comme ci-dessous...

override func viewDidLoad() {
    super.viewDidLoad()

    setBackButton()
}

Si vous souhaitez remplacer la méthode de sélection du bouton de retour, vous pouvez procéder comme ceci.

 override func btnBackTapped() {
    //do your stuff here...show alert for unsaved data    
    super.btnBackTapped()
 }

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Exporter la table de l'arborescence vers CSV avec mise en forme

  3. 3

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  4. 4

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Laravel SQLSTATE [HY000] [1049] Base de données inconnue 'previous_db_name'

  9. 9

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  10. 10

    php ajouter et fusionner des données de deux tables

  11. 11

    Créer un système Buzzer à l'aide de python

  12. 12

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  13. 13

    Comment changer la couleur de la police dans R?

  14. 14

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  15. 15

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    comment afficher un bouton au-dessus d'un autre élément ?

  18. 18

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  19. 19

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  20. 20

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  21. 21

    Comment analyser un fichier avec un tableau d'objets JSON en utilisant Node.js?

chaudétiquette

Archive