Comment exécuter une fonction dans la vue principale depuis une vue en Present Modally avec Swift
Il peut être utile dans certains cas d’exécuter une fonction présente dans le code de la vue principale d’une application, depuis une vue affichée en Present Modally.
Par exemple dans le cas d’un système de recherche. Vous pouvez avoir un champ de recherche simple dans la vue principale et plusieurs champs de recherche avancées dans la seconde vue.
Dans ce cas, les résultats s’affichant sur la vue principale il faut pouvoir envoyer la recherche entre les deux vues.
Voici comment réaliser cela en utilisant un protocole et un délégué :
1 : Créer un protocole
Vous devez dans un premier temps créer un protocole qui définira les méthodes nécessaires à l’exécution de la fonction dans la vue principale. Cela se fait dans le code de la vue secondaire (celle présentée modalement) :
protocol RechercheAvanceeViewDelegate: AnyObject {
func setRecherche(recherche: Recherche)
}
Ce protocole définit la ou les fonctions qui pourrons être exécutées depuis cette vue. Elles correspondent à des fonctions présentes dans le code de la vue principale.
Dans notre exemple on lancera la fonction "setRecherche(…)" pour envoyer nos champs de recherche vers la vue principale.
2 : Ajouter une propriété délégué
Ensuite, vous devez ajouter une propriété délégué à votre vue présentée modalement pour lui permettre de communiquer avec la vue principale.
Ajoutez donc le code toujours dans le fichier de votre vue secondaire :
class RechercheAvanceeViewController: UIViewController {
weak var delegate: RechercheAvanceeViewDelegate?
// ...
}
Ici, vous déclarez une propriété déléguée de type “RechercheAvanceeViewDelegate” qui sera utilisée pour exécuter la fonction dans la vue principale.
3 : Appeler la méthode du délégué
Lorsque vous souhaitez exécuter la fonction dans la vue principale, vous devez appeler la méthode “setRecherche(…)” du délégué.
Vous utiliserez donc dans le code de votre vue secondaire :
delegate?.setRecherche(recherche: recherche)
dismiss(animated: true, completion: nil)
La première ligne permet donc d’appeler la fonction.
La seconde est facultative, elle permet de fermer la vue secondaire pour retourner sur la vue principale, là ou sera exécutée la fonction.
4: Configurer votre vue principale
Maintenant, vous devez configurer votre vue principale pour qu’elle se conforme au protocole afin de pouvoir implémenter la fonction “setRecherche(…)”.
Dans le fichier code de votre vue principale, ajoutez la conformité au protocole “RechercheAvanceeViewDelegate” :
class MainViewController: UIViewController, RechercheAvanceeViewDelegate {
// ...
}
Ensuite, implémentez la fonction “setRecherche(…)” dans votre vue principale :
func setRecherche(recherche: Recherche) {
// Exécutez votre fonction ici
}
Voici donc la fonction qui sera exécutée. Ajoutez donc le code que vous souhaitez ici. Dans notre exemple, ce serait l’enregistrement des champs de recherche. Il ne suffirait donc plus qu’à enregistrer le contenu de notre paramètre “recherche” dans une variable locale.
5 : Configuration du délégué sur la vue principale
La dernière étape consiste à configurer le délégué sur la vue principale, afin que la vue secondaire puisse appeler une fonction se trouvant sur la vue principale.
Cette étape peut se faire de deux façons, suivant si vous avez configuré l’affichage de la vue Present Modally directement depuis le Storyboard de Xcode (par exemple, si vous l’avez configurée avec un glisser-déposer en maintenant la touche Contrôle dans le Storyboard).
Voici donc les deux méthodes :
Dans le cas où vous avez configuré l’affichage de votre vue secondaire depuis le Storyboard :
-
Cliquez sur la flèche correspondant au Segue entre les deux vues :
-
Dans l’onglet “Attributes Inspector”, définissez un “Identifier” (vous pouvez choisir le nom de votre choix) :
-
Enfin, dans le code de votre vue principale, ajoutez ceci :
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if(segue.identifier == "segueFiltresRecherche")
{
if let modalViewController = segue.destination as? RechercheAvanceeViewController {
modalViewController.delegate = self
}
}
}
Cette fonction est exécutée à chaque fois qu’un Segue est affiché.
On regarde donc si l’identifiant du Segue correspond bien à celui qu’on a configuré précédemment.
Puis, si c’est le cas et que le Segue est bien de type RechercheAvanceeViewController, alors on configure le délégué.
Dans le cas ou vous avez configuré l’affichage de votre vue secondaire depuis le code :
- Il suffit dans ce cas de définir le délégué sur la vue principale, juste avant de lancer l’affichage de la vue secondaire :
let rechercheAvanceeViewController = RechercheAvanceeViewController()
rechercheAvanceeViewController.delegate = self
present(modalViewController, animated: true, completion: nil)
Ce code définit donc le délégué et affiche la vue demandée.
Voilà, il vous est maintenant possible d’exécuter des fonctions de la vue principale depuis la vue présentée modalement. Si vous souhaitez définir davantage de fonction, il vous suffit de les ajouter au protocole pour quelle soient utilisable entre les vues.
Catégories : Swift
Par Guillaume le 06/03/2023 à 13:51