1

Les protocoles sont un outil puissant et avancé qui permet de rendre vos applications plus faciles à concevoir et à étendre. Ils définissent un comportement standard dans des classes qui ne sont pas nécessairement liées. Les protocoles utilisés avec les délégués vous permettent de créer des classes avec une charge de responsabilités bien équilibrée .

Maîtrisez votre iPhone en une minute par jour :

Inscrivez-vous à la newsletter "Tip of the Day" de iphonologie et nous vous enverrons chaque jour un conseil pour gagner du temps et tirer le meilleur parti de votre iPhone ou iPad.

Les protocoles sont une fonction puissante utilisée dans tout le Cocoa Touch Framework, il est donc important de bien saisir le sujet. Ils constituent un outil formidable pour aider à créer des applications faciles à étendre. Les protocoles sont équivalents aux interfaces dans des langages tels que Java et C#.

En dehors du monde du logiciel, un protocole est défini comme suit :

Le code de comportement établi dans tout groupe, organisation ou situation.

Cette définition n'est pas loin de la réalité en ce qui concerne les protocoles de Swift. Ils définissent un comportement standard qui peut être adopté par des classes, des structures et des énumérations.

Il y a deux façons principales d'ajouter un comportement commun aux classes dans l'héritage et les protocoles de classe Swift.

Le côté gauche de La figure 1 montre l'utilisation de l'héritage de classe pour définir le comportement standard. Les sous-classes héritent du comportement défini dans la superclasse. La partie droite de la figure 1 montre l'utilisation d'un protocole pour définir le comportement standard. Les classes qui adoptent le protocole sont garanties d'implémenter le comportement défini dans le protocole. C'est une excellente option pour ajouter un comportement commun à des classes qui ne se trouvent pas dans la même chaîne d'héritage, ou pour des énumérations et des structures qui ne peuvent pas être sous-classées.

Figure 1 - Ajout d'un comportement commun avec l'héritage de classe et les protocoles.

L'une des utilisations les plus courantes des protocoles du Cocoa Touch Framework est liée aux contrôles de l'interface utilisateur. Un exemple en est le contrôle de l'affichage du sélecteur.

Les vues du sélecteur peuvent contenir une ou plusieurs composantes comme le montre la figure 2 .

Figure 2 - Une vue "picker" peut avoir plusieurs composantes.

Le contrôle UIPickerView fonctionne avec un objet source de données et un objet délégué pour remplir ses lignes et répondre à la sélection de l'utilisateur. En fait, la classe UIPickerView possède à la fois une propriété dataSource et une propriété delegate contenant une référence à ces objets ( Figure 3 ).En prime, lorsque vous apprenez comment les objets source de données et délégué fonctionnent avec la vue de sélection, vous apprenez également comment ils fonctionnent avec d'autres contrôles tels que les vues de table et les vues de collection.

Figure 3 - A UIPickerView a une source de données et un délégué.

L'objet source de données indique au sélecteur combien de composants, ou de colonnes, se trouvent dans le sélecteur et combien de lignes se trouvent dans chaque composant.

Le délégué fournit de l'aide pour construire chaque ligne dans la vue du sélecteur et répond à l'utilisateur qui sélectionne un élément. Dans la programmation orientée objet, un délégué est un objet qui effectue une tâche pour un autre objet - ce qui est tout à fait vrai dans ce cas.

La beauté de la conception de la figure 3 est que tout objet peut servir de source de données ou de délégué. Il suffit de stocker les objets que vous voulez utiliser dans les propriétés dataSource et delegate de la vue de sélection, et à des moments précis, la vue de sélection appelle des méthodes spécifiées sur l'objet source de données et delegate. Vous pouvez même faire en sorte que le même objet agisse à la fois comme source de données et comme délégué. (C'est en fait une pratique courante, comme vous le verrez dans un instant.)

Quelles sont les méthodes utilisées par le ramasseur pour visualiser chacun de ces objets ? Comment pouvez-vous garantir que les objets spécifiés dans les propriétés de dataSource et de delegate disposent des méthodes dont la vue de sélection a besoin ? La réponse est protocoles .

Le protocole UIPickerViewDataSource déclare les méthodes requises par un objet qui veut agir comme source de données pour la vue du sélecteur. De son côté, le protocole UIPickerViewDelegate déclare les méthodes requises par un objet qui veut agir comme délégué pour la vue de sélection. Examinons de plus près chacun de ces protocoles.

Protocole UIPickerViewDataSource

Le protocole UIPickerViewDataSource déclare ces méthodes :

Les deux méthodes de ce protocole sont requises, donc tout objet qui veut agir comme source de données pour une vue de sélection doit implémenter ces deux méthodes.

UIPickerViewDelegate Protocol

Le protocole UIPickerViewDelegate déclare ces méthodes :

Aucune des méthodes du protocole UIPickerViewDelegate n'est marquée "obligatoire", mais votre vue "picker" ne fonctionnera pas bien sans la mise en œuvre des méthodes les plus couramment utilisées :

  • pickerView:titleForRow:forComponent :
  • pickerView:didSelectRow:inComponent :

pickerView:titleForRow:forComponent : renvoie un titre pour la ligne et le composant spécifiés. La deuxième méthode, pickerView:didSelectRow:inComponent : , fournit un endroit où vous pouvez mettre un code pour répondre à un utilisateur qui sélectionne un élément dans la vue de sélection.

Adopter des protocoles

Une classe adopte un protocole pour indiquer qu'elle met en œuvre toutes les méthodes requises et souvent aussi certaines des méthodes facultatives. Plutôt qu'un objet séparé agissant comme source de données et délégué, La figure 4 montre une convention iOS commune par laquelle un contrôleur de vue adopte les deux protocoles pour la vue de sélection.

Figure 4 - Un contrôleur de vue met souvent en œuvre des protocoles de contrôle de l'interface utilisateur.

Une classe peut déclarer qu'elle adopte des protocoles spécifiques. Dans le code suivant, la classe ViewController adopte les protocoles UIPickerViewDataSource et UIPickerViewDelegate :

Les protocoles adoptés par une classe sont énumérés après la déclaration de superclasse et séparés par des virgules.

Les protocoles, étape par étape

Pour mieux comprendre l'utilisation des protocoles, écrivons un code à partir de zéro qui remplit une vue de sélection et répond à la sélection d'un élément dans la vue de sélection. Pour continuer, téléchargez le projet de code type à partir de ce lien .

  1. Ouvrez le ProtocolDemo exemple de projet de code.
  1. Dans le navigateur de projet, forez dans le nœud ProtocolDemo et sélectionnez le fichier Main.storyboard . Vous devriez voir la scène affichée dans Figure 5 .

Figure 5 - La vue du ramasseur sur une scène de story-board.

Actuellement, aucun code de la classe ViewController n'est associé à la vue de sélection, bien qu'il existe des propriétés que vous pouvez utiliser pour référencer la vue de sélection et l'étiquette. Il existe également un tableau fifaWinners contenant les quatre derniers vainqueurs de la Coupe du monde de la FIFA, que vous utiliserez pour remplir la vue de sélection.

Vous devez maintenant créer une source de données et déléguer pour la vue de sélection. N'oubliez pas qu'il est courant que le contrôleur de vue associé agisse en tant que source de données et délégué. Cela signifie qu'il doit adopter les protocoles UIPickerViewDataSource et UIPickerViewDelegate.

  1. Sélectionnez le fichier de code ViewController.swift dans le navigateur de projet et changez la déclaration de classe en

Lorsque vous ajoutez les protocoles, vous verrez immédiatement une erreur de compilation . Le type "ViewController" n'est pas conforme au protocole "UIPickerViewDataSource" . C'est tout à fait exact. Vous avez déclaré que la classe ViewController implémente les protocoles de vue du sélecteur, mais sans encore ajouter les méthodes.

Débarrassons-nous de cette erreur en implémentant les méthodes du protocole UIPickerViewDataSource .

  1. En haut du fichier ViewController.swift , directement en dessous de la déclaration du tableau fifaWinners , ajoutez les méthodes suivantes :

Dès que vous ajoutez ce code, l'erreur disparaît, même si vous n'avez pas mis en œuvre les deux protocoles. Cela est dû au fait que vous n'êtes pas obligé d'implémenter les méthodes UIPickerViewDelegate (bien que vous le ferez).

Le numéro des composants dans PickerView:pickerView : renvoie 1, car vous ne voulez qu'une seule colonne, ou composant, dans la vue du sélecteur.

Le pickerView:numberOfRowsInComponent : renvoie le nombre d'éléments dans le tableau fifaWinners . Comme un seul composant se trouve dans la vue du sélecteur, le paramètre component est ignoré.

  1. Maintenant, implémentons le protocole UIPickerViewDelegate . Dans le fichier ViewController.swift , directement sous les méthodes que vous venez d'ajouter, ajoutez ces deux nouvelles méthodes :

Le pickerView:titleForRow:forComponent : renvoie l'élément du tableau fifaWinners en utilisant la ligne de vue du sélecteur actuellement sélectionnée comme index.

Le pickerView:didSelectRow:inComponent : s'exécute automatiquement lorsqu'un utilisateur sélectionne un élément dans la vue du sélecteur. Elle récupère le texte de la ligne de la vue du sélecteur actuellement sélectionnée dans le tableau fifaWinners et le stocke dans la propriété text de l'étiquette en haut de la vue.

Maintenant que vous avez implémenté les méthodes pour les deux protocoles, appuyez sur le bouton Exécuter pour lancer l'application dans le Simulateur. Curieusement, la vue du sélecteur est vide ( Figure 6 ) !

Figure 6 - La vue du ramasseur est vide !

J'ai fait exprès de vous faire "oublier" de définir ces propriétés, parce que c'est quelque chose que vous oublierez souvent de faire dans le développement quotidien de votre application. Maintenant, vous pouvez voir à quoi ressemble une vue de sélection à l'exécution lorsque ses propriétés dataSource et delegate ne sont pas définies !

  1. Examinons d'abord les propriétés de dataSource et delegate . Retournez à Xcode et cliquez sur le bouton Stop . Sélectionnez le fichier Main.storyboard dans le navigateur de projet pour afficher le storyboard dans la surface de conception.
  1. Sélectionnez la vue du sélecteur en cliquant dessus.

Vous pouvez consulter les propriétés dataSource et delegate dans l'inspecteur de connexions de Xcode, situé dans le panneau Utilitaires sur le côté droit de la fenêtre Xcode. Si le panneau Utilitaires de Xcode n'est pas visible, cliquez sur le bouton à l'extrême droite dans le groupe de boutons Affichage en haut de la fenêtre Xcode (le panneau Utilitaires est visible si ce bouton est enfoncé comme indiqué dans Figure 7 ).

Figure 7 - Afficher le panneau des utilitaires.

Dans le panneau Utilitaires, visualisez l'inspecteur de connexions en sélectionnant le bouton à l'extrême droite ( Figure 8 ).

Figure 8 - Afficher l'inspecteur des connexions.

Les propriétés dataSource et delegate de la vue du sélecteur se trouvent en haut de l'inspecteur. Remarquez les cercles à droite des propriétés. Ces propriétés sont appelées puits de connexion . Lorsqu'ils sont vides, les propriétés ne sont connectées à rien. Relions les propriétés de la vue du sélecteur dataSource et delegate au contrôleur de vue.

  1. Dans le fichier de storyboard, maintenez la touche control enfoncée et cliquez sur la vue du sélecteur. Tout en maintenant la touche control enfoncée, faites-la glisser jusqu'à l'icône du contrôleur de vue dans le dock de la scène ( Figure 9 ).

Figure 9 - Contrôle+glisser vers l'icône du contrôleur de vue.

  1. Lorsque vous voyez apparaître le popup View Controller, relâchez le bouton de la souris et la touche control et vous verrez le popup Outlets ( Figure 10 ).

Figure 10 - Sélectionnez la sortie dataSource .

  1. Sélectionnez la source de données en cliquant dessus. Vous verrez la petite icône du View Controller clignoter, indiquant que la connexion a été établie.
  1. Ensuite, Control+Drag à nouveau entre la vue du sélecteur et l'icône View Controller. Remarquez le petit point blanc à gauche de la prise dataSource , indiquant qu'elle a déjà été sélectionnée. Cette fois, sélectionnez la déléguée sortie ( Figure 11 ).

Figure 11 - Sélectionnez la prise de délégué .

Maintenant, regardez l'inspecteur de connexions et vous pouvez voir que les deux prises dataSource et delegate sont connectées au contrôleur de visualisation, et que les puits de connexion ne sont plus vides ( Figure 12 ).

Figure 12 - Les prises dataSource et delegate sont connectées au contrôleur de vue.

  1. Voyons comment ces nouvelles connexions fonctionnent en temps réel. Cliquez sur le bouton "Run" de Xcode . Lorsque l'application apparaît dans le Simulateur, vous pouvez voir que la vue du sélecteur contient une liste des équipes de la FIFA ( Figure 13 ).

Figure 13 - Les équipes de la FIFA affichées au moment de la course

  1. Sélectionnez un élément dans la liste. Lorsque vous le faites, le pickerView:didSelectRow:inComponent : est automatiquement appelée et l'élément sélectionné est affiché dans la propriété text de l'étiquette ( Figure 14 ).

Figure 14 - L'équipe sélectionnée apparaît dans l'étiquette.

L'utilisation de protocoles en conjonction avec la vue "picker" est une approche courante que vous utiliserez souvent avec différentes commandes d'interface utilisateur dans iOS.

Déclarer vos propres protocoles

Maintenant que vous comprenez les bases de l'utilisation des protocoles qui ont été déclarés dans le Cocoa Touch Framework, dans la deuxième partie de ce post, vous apprendrez à déclarer vos propres protocoles personnalisés et vous verrez des situations réelles où ils peuvent être utilisés dans vos applications iOS !

Click to rate this post!
[Total: 0 Average: 0]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *