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.
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.
laisse moi dire quelques mots