SDK iOS Délégués personnalisés

Les délégués sont un outil utile pour la communication entre les objets. Dans ce tutoriel, nous allons créer et implémenter un délégué personnalisé pour permettre à trois UISliders ajuster la couleur de fond d'un ViewController.


A propos des délégués

Les messages en Objective-C sont à sens unique. Une classe parent peut envoyer un message à son enfant, mais celui-ci ne peut, à lui seul, envoyer un message à son parent. Cependant, avec l'aide d'un délégué, une communication bidirectionnelle peut être réalisée. UIScrollView et UITableView utilisez régulièrement des délégués pour communiquer entre le modèle, la vue et le contrôleur. Le motif de délégué est utile pour de nombreuses raisons. Un délégué peut être utilisé pour rendre un objet réutilisable, pour fournir un moyen flexible d’envoyer des messages ou pour implémenter une personnalisation..


Étape 1: Créer un nouveau projet

Lancez Xcode et cliquez sur Fichier> Nouveau> Projet. Sélectionnez une application iOS Single View et cliquez sur "Suivant". Nommez votre produit "Délégués" et entrez un nom pour votre identifiant d'entreprise, tel que "com.companyName.delegates". Choisissez la famille de périphériques iPhone et cliquez sur "Suivant". Choisissez un emplacement pour stocker votre projet et cliquez sur "Créer".


Étape 2: Sous-classement UISlider

Cliquez sur Fichier> Nouveau> Fichier et choisissez une classe Cocoa Touch Objective-C. Nommez votre classe "MTSlider" et choisissez UISlider dans le menu déroulant "Sous-classe de". Cliquez sur "Suivant", puis cliquez sur "Créer".


Étape 3: Ajout des méthodes de protocole de délégué

Nous devons d’abord déclarer les méthodes pour le délégué. Cliquez sur "MTSlider.h." Tapez le code suivant au dessus de l'interface.

 @classe MTSlider; @protocol MTSliderDelegate  @optional - (void) MTSliderDidChange: (MTSlider *) MTSlider withValue: (CGFloat) valeur; @ requis - (CGFloat) startPositionForMTSlider: (MTSlider *) MTSlider; @fin

Directive du compilateur

Remarquez la ligne @class MTSlider. En plaçant ce code au-dessus de tout le reste, le compilateur est informé qu’à un moment donné,, MTSlider sera déclaré. Sans cette directive du compilateur, le compilateur vous avertira car il s'attend à trouver l'interface pour MTSlider tout de suite.

Déclarer les méthodes de délégué

Les méthodes du délégué sont déclarées à partir de @protocole. Le protocole MTSliderDelegate conforme à la NSObject protocole pour une raison spécifique. le NSObject protocole contient une méthode, répond au sélecteur:, qui peut être utilisé pour s'assurer que l'objet délégué implémente réellement une méthode optionnelle avant que la méthode ne soit appelée. L'appel d'une méthode qui n'est pas implémentée par l'objet délégué provoquera le blocage d'une application..

Méthode optionnelle

En clair, une méthode optionnelle est une méthode qui ne doit pas nécessairement être implémentée par l’objet délégué; dans ce cas, l'objet délégué sera le ViewController, Cependant, cela pourrait être n'importe quel objet. La méthode optionnelle MTSliderDidChange: withValue: est envoyé dans l'objet délégué lorsque la valeur du curseur change.

Méthode requise

D'autre part, une méthode requise est une méthode qui doit être implémentée par l'objet délégué ou vous obtiendrez un avertissement du compilateur. La méthode requise startPositionForMTSlider: demande à l'objet délégué où les curseurs doivent commencer et obtient sa valeur de position de départ en retour du délégué.

Création d'une variable d'instance pour le délégué

Toujours dans "MTSlider.h", tapez le code suivant directement ci-dessous @interface pour déclarer une variable d'instance ou ivar pour le délégué.

 identifiant  sliderDelegate;

Si vous utilisent ARC, tapez le code suivant à la place:

 __double identifiant  sliderDelegate;

L'ivar est de type identifiant il est donc flexible et peut accepter n'importe quel type d'objet. La partie suivante, MTSliderDelegate dit que tout objet finit par être assigné à sliderDelegate contiendra les méthodes de protocole de MTSliderDelegate dans le cadre de sa propre mise en œuvre.

Créer les Setters and Getters

Terminez en synthétisant les méthodes setter et getter. Tapez le code suivant juste en dessous de l'accolade fermante de la variable d'instance..

 @property (nonatomic, assign) id  sliderDelegate;

Si vous utilisent ARC, tapez le code suivant à la place:

 @property (nonatomic, faible) id  sliderDelegate;

Cliquez sur "MTSlider.m" et tapez le code suivant juste en dessous @la mise en oeuvre pour compléter la propriété.

 @synthesize sliderDelegate;

Étape 4: Conformité aux méthodes du protocole de délégué

Cliquez sur le fichier "ViewController.h". Tapez le code suivant pour vous conformer à la MTSliderDelegate protocole et importer "MTSlider.h."

 #import "MTSlider.h" @interface ViewController: UIViewController 

Implémentation des méthodes du protocole de délégué

Cliquez sur le fichier "ViewController.m" et tapez le code suivant pour implémenter le MTSliderDelegate méthodes de protocole.

 - (CGFloat) startPositionForMTSlider: (MTSlider *) MTSlider  - (void) MTSliderDidChange: (MTSlider *) MTSlider withValue: (CGFloat) valeur 

Étape 5: Définition du délégué

Initialiseur Personnalisé

La création d'un initialiseur personnalisé est essentielle pour obtenir la position de départ des curseurs. Dans "MTSlider.h", ajoutez le code suivant pour déclarer le nouvel initialiseur..

 - (id) initWithFrame: (CGRect) frame etDelegate: (id) delegateObject;

Cliquez sur "MTSlider.m" et recherchez le initWithFrame: méthode. Supprimer la méthode existante et la remplacer par le code suivant.

 - (id) initWithFrame: (CGRect) frame etDelegate: (id) delegateObject self = [super initWithFrame: frame]; if (self) self.sliderDelegate = delegateObject; self.value = [sliderDelegate startPositionForMTSlider: self];  retourner soi-même; 

La définition du délégué lors de l'initialisation permet à la méthode déléguée d'être appelée immédiatement. La méthode startPositionForMTSlider: obtient le point de départ des curseurs. Comme il est appelé dans l'initialiseur, les positions des curseurs sont définies avant leur affichage à l'écran.

Primordial UISlider Méthode

le UISlider méthode setValue: animé: s’appelle automatiquement chaque fois qu’une patte de curseur est déplacée. Toujours dans le fichier "MTSlider.m", ajoutez la méthode suivante.

 - (void) setValue: (float) valeur animée: (BOOL) animée [super setValue: valeur animée: animée]; if (sliderDelegate! = nil && [sliderDelegate répondToSelector: @selector (MTSliderDidChange: withValue:)]]  

En remplaçant setValue: animé: chaque fois qu'une cheville de curseur se déplace, un message est envoyé à l'objet délégué. Remarquez l'appel à super, super setValue: animé:. Il est important que nous n'endommagions pas accidentellement quelque chose que la méthode fait en coulisse lorsque vous surchargez une méthode existante..

La méthode du délégué MTSliderDidChange: withValue: est la méthode de protocole optionnelle déclarée précédemment. L'objet délégué est envoyé chaque fois que le curseur est modifié. N'oubliez pas que l'appel d'une méthode qui n'a pas été implémentée provoquera le blocage de l'application. Appel répond au sélecteur: sur l'objet délégué vérifie qu'il est correct d'aller de l'avant et d'envoyer un message à la méthode de délégation facultative.


Étape 6: Définition de la couleur d'arrière-plan et instanciation des curseurs

Cliquez sur le fichier "ViewController.m" et tapez le code suivant à l'intérieur viewDidLoad définir la couleur d'arrière-plan de la vue avec quatre composants de couleur et instancier le rouge, le vert et le bleu MTSlider objets. Si vous utilisent ARC, assurez-vous de supprimer les lignes [version de redSlider];, [version de greenSlider];, et [version de blueSlider]; comme ces appels ne sont pas nécessaires.

 CGFloat sliderColorPosition = 0.3f; self.view.backgroundColor = [UIColor colorWithRed: sliderColorPosition vert: sliderColorPosition bleu: sliderColorPosition alpha: 1.0f]; CGRect redSliderFrame = CGRectMake (20.0f, 20.0f, 280.0f, 28.0f); MTSlider * redSlider = [[MTSlider alloc] initWithFrame: redSliderFrame andDelegate: self]; redSlider.tag = 1; [auto.view addSubview: redSlider]; [version de redSlider]; CGRect greenSliderFrame = CGRectMake (20.0f, 70.0f, 280.0f, 28.0f); MTSlider * greenSlider = [[MTSlider alloc]] initWithFrame: greenSliderFrame andDelegate: self]; greenSlider.tag = 2; [auto.view addSubview: greenSlider]; [version de greenSlider]; CGRect blueSliderFrame = CGRectMake (20.0f, 120.0f, 280.0f, 28.0f); MTSlider * blueSlider = [[MTSlider alloc]] initWithFrame: blueSliderFrame andDelegate: self]; blueSlider.tag = 3; [self.view addSubview: blueSlider]; [version de blueSlider];

En utilisant la coutume MTSlider initialiseur, initWithFrame: andDelegate:, le délégué est défini et le ViewController objet devient l'objet délégué de chaque curseur. Normalement, vous pouvez vous attendre à voir un ensemble de délégués utilisant le code suivant: redSlider.sliderDelegate = self;. Cependant, dans ce cas, l'affectation de délégué est transmise lors de l'initialisation..

Notez que la propriété de balise de chaque curseur a été définie. Au départ, la couleur de fond du ViewController est réglé sur gris foncé. Lorsque chaque curseur est ajusté, la couleur d'arrière-plan change en conséquence, car la balise identifie le curseur actif..


Étape 7: Changer la couleur de fond

Trouvez l'implémentation de startPositionForMTSlider:, et tapez le code suivant entre les accolades pour définir la valeur initiale des curseurs sur 0,3.

 CGFloat sliderStartPosition = 0.3f; retour sliderStartPosition;

Ajuster la couleur de fond

Trouvez l'implémentation de MTSliderDidChange: withValue:, et ajoutez le code suivant pour ajuster la couleur de fond.

 if (MTSlider.tag == 1) // Curseur rouge CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentGreen = colorsPointer [1]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: valeur green: currentGreen bleu: currentBlue alpha: 1.0f];  if (MTSlider.tag == 2) // Curseur vert CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentBlue = colorsPointer [2]; self.view.backgroundColor = [UIColor colorWithRed: currentRed green: valeur blue: currentBlue alpha: 1.0f];  if (MTSlider.tag == 3) // Slider bleu CGColorRef bgColor = self.view.backgroundColor.CGColor; const CGFloat * colorsPointer = CGColorGetComponents (bgColor); CGFloat currentRed = colorsPointer [0]; CGFloat currentGreen = colorsPointer [1]; self.view.backgroundColor = [Couleur UIColorWithRed: currentRed vert: currentGreen bleu: valeur alpha: 1.0f]; 

Chaque fois que le curseur change, un message est envoyé à la méthode déléguée. Le message contient le courant MTSlider et sa valeur. La propriété de balise du curseur actuel est utilisée pour déterminer quel curseur a envoyé le message et la couleur d'arrière-plan est mise à jour en conséquence.


Étape 8: Test du délégué

Cliquez sur Produit> Exécuter ou sur la flèche "Exécuter" dans le coin supérieur gauche pour afficher les curseurs en action. Ajustez les curseurs pour voir comment les éléments enfants peuvent contrôler la couleur d'arrière-plan de l'élément parent.


Conclusion

Il y a beaucoup d'autres moyens de contrôler la couleur de fond d'un UIViewController, y compris les cibles ou les notifications. Apple conçu UISlider utiliser un modèle cible pour transmettre des données. Toutefois, si vous souhaitez ajouter plus de fonctionnalités, le meilleur moyen de communiquer d'un enfant à son parent consiste à créer un délégué personnalisé..