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
.
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..
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".
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".
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
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.
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..
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.
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é.
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é.
identifiantsliderDelegate;
Si vous utilisent ARC, tapez le code suivant à la place:
__double identifiantsliderDelegate;
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.
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) idsliderDelegate;
Si vous utilisent ARC, tapez le code suivant à la place:
@property (nonatomic, faible) idsliderDelegate;
Cliquez sur "MTSlider.m" et tapez le code suivant juste en dessous @la mise en oeuvre
pour compléter la propriété.
@synthesize sliderDelegate;
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
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
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.
UISlider
Méthodele 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.
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..
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;
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.
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.
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é..