La POO ça vous dit quelque chose ?
On ne va pas s'étendre sur le sujet car vous connaissez déjà la POO (mais si, vous vous souvenez, cette méthode qui permet de manipuler des objets !). Je vais reprendre ici la documentation d'Apple qui est la plus concise et complète que je connais à ce sujet.
MVC : rappelez-vous...
Modèle
Un modèle est un objet (d'où l'intérêt de la POO) qui va contenir les données spécifiques à l'application. C'est lui qui gère le traitement de ces données.
Quand on parle de modèle, on parle de relations : l'héritage par exemple. Homme et Enfant héritent d'Etre humain mais pas Oiseau. En revanche, Oiseau, Homme et Enfant héritent d'Etre vivant.
Mais vous savez déjà tout ça.
Lorsqu'une appli est chargée de récupérer des données spécifiques, ces données sont quasi-systématiquement gérées comme des objets. L'appli Facebook récupère du texte de ses serveurs et en fait des objets Article, Commentaire, etc.
Vue
Une vue est un élément que l'utilisateur peut voir. Non, je ne vous prends pas pour un débile, c'est la définition la plus compréhensible mais aussi la plus exacte.
Une vue est un élément d'une interface. Qui dit interface, dit aussi échanges, interactions. C'est donc un élément avec lequel l'utilisateur va jouer, interagir, cliquer, etc.
Pour faire le lien avec le modèle, une vue affiche les données contenues dans le modèle et peut par exemple permettre de modifier ces données, d'en ajouter ou d'en supprimer. Modèles et vues sont très liés et c'est la raison pour laquelle beaucoup de développeurs écrivent directement les vues sans passer par les modèles et créent des sortes de vue-modèles.
Contrôleur
Le contrôleur, lui, joue plutôt le rôle d'intermédiaire entre vues et modèles. Le contrôleur est un ensemble de fonctions. Il constitue tout ce qu'on ne peut pas voir dans un programme.
C'est aussi un gérant, il interagit directement avec le système pour récupérer les connexions réseau, l'appareil photo, le stockage, etc. en interprétant les actions de l'utilisateur.
Utilisez le modèle MVC dans notre application
Dans notre application, nous avons déjà une vue : notre classe BoutonArrondi
ne gère que quelque chose de visuel.
Quel modèle pourrait-on créer dans notre appli?
Créons un nouveau fichier (Clic droit sur "First App"…) "CalculExercice.swift" et créons la classe CalculExercice
.
Quand on crée un modèle, on se pose ce genre de question :
Qu'est-ce qui est propre à un exercice?
Sa consigne,
Son titre éventuellement,
La réponse attendue.
On va donc créer 3 variables de type String, String et Int (par exemple : consigne, titre, reponse).
On va créer un constructeur init(difficulte: Int)
. C'est dans ce constructeur que nous initialiserons les variables de classes :
init(difficulte : Int) {
switch difficulte {
case 2:
consigne = "8 x 7"
titre = "Niveau moyen"
reponse = 56
break
default:
consigne = "4 + 4"
titre = "Niveau facile"
reponse = 8
break
}
}
Dans notre classe Exercice
, nous allons créer une variable calcul
de type CalculExercice
.
Au moment d'initialiser un Exercice
, au lieu de lui attribuer sa difficulté, on lui attribue directement son objet calcul
:
@IBAction func bExoClic(sender : UIButton) {
//On récupère Main.storyboard
let storyboard = UIStoryboard(name: "Main", bundle: nil)
//On crée une instance d'Exercice à partir du storyboard
let exo = storyboard.instantiateViewControllerWithIdentifier("exercice") as! Exercice
//On lui attribue le calcul en fonction du tag du bouton
exo.calcul = CalculExercice(difficulte: sender.tag)
//On montre le nouveau controller
navigationController?.showViewController(exo, sender: self)
}
Pour modifier le texte des labels de titre et de la consigne, on va créer deux variables dans Exercice, à lier au storyboard :
@IBOutlet var lTitle : UILabel!
@IBOutlet var lConsigne : UILabel!
Je vous laisse les lier au storyboard :
Enfin, dans notre classe Exercice
, dans viewdidload
, nous allons changer dynamiquement le titre de la page :
//On peut donc changer le texte des labels dynamiquement
lTitle.text = calcul.titre
//On doit ajouter = ? à la fin de la consigne
lConsigne.text = "\(calcul.consigne) = ?"
Et pour vérifier une bonne réponse, on remplace :
if Int(resultat) == 8
par
if Int(resultat) == calcul.reponse
Vous avez créé votre premier modèle en Swift, bravo !
En général, on préfère séparer les modèles, les vues et les contrôleurs dans des dossiers différents.
Dans Xcode, sélectionnez les fichiers à placer dans un dossier :
Faites un clic droit sur l'un d'eux > "New group from selection" :
Nommez le groupe comme vous le souhaitez :
Puis, pour avoir une arborescence plus claire : cliquez droit sur First App > Sort by Type :
Voyons maintenant deux nouvelles vues très prisées : UITableView
etUIWebView
.