2010-01-21 3 views
0

Dans le livre que je suis en train de lire, l'auteur implémente un IBAction pour un curseur de la manière suivante (voir ci-dessous V001). À mon avis, cela semblait un peu compliqué alors j'ai refait le code (V002). Ai-je raison de penser que l'expéditeur est un pointeur vers l'objet qui a déclenché l'événement? En outre, y a-t-il un inconvénient à lancer l'expéditeur dans l'en-tête, plutôt que de le laisser comme expéditeur et de le lancer dans le corps de la méthode?Méthode d'action iPhone UISlider

v001

-(IBAction)sliderChange:(id)sender { 
    UISlider *slider = (UISlider *)sender; 
    int progressAsInt = (int)([slider value] + 0.5f); 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d", progressAsInt]; 
    [sliderLabel setText:newText]; 
    [newText release];  
} 

v002

-(IBAction)sliderChange:(UISlider*)sender { 
    NSString *newText = [[NSString alloc] initWithFormat:@"%d",(int)[sender value]]; 
    [sliderLabel setText:newText]; 
    [newText release]; 
} 

gary

Répondre

3

identifiant un type spécial qui peut contenir un objet. La nuance est que vous n'avez pas de sécurité de type bien défini. Vous pouvez appeler n'importe quel sélecteur sur n'importe quel objet, et s'il existe, il sera appelé. En V001, faire [la valeur du curseur] au lieu de [la valeur de l'expéditeur] a un sens plus logique, ce qui est probablement la raison pour laquelle vous avez pris le refactoring parce qu'il ne semblait pas être appelé.

Dans V002 [valeur de l'expéditeur] récupère la propriété float du même UISlider mais cache le fait que vous ne pouvez pas obtenir un objet curseur, et il pourrait être sur n'importe quel objet.

Ceci est une question de style et de discrimination. Je suis assez diligent dans mon propre code pour déterminer quel objet concret j'essaye d'accéder à un sélecteur, et irai même jusqu'à appeler isKindOfClass, et vérifiant que j'appelle le sélecteur sur l'objet UISlider correct. Pour répondre à votre question: le type de l'objet n'est pas évité comme il devrait l'être lors de l'utilisation de l'identifiant.

Pourquoi? Je veux plusieurs curseurs dans la même vue pour gérer l'événement du curseur, je ne veux pas qu'un seul curseur affecte les données des deux, même si je souhaite les manipuler de la même manière.

+0

Merci pour vos commentaires. Y a-t-il une convention où la dénomination de la variable "expéditeur" doit rester inchangée, je pourrais la renommer "slider" pour mieux représenter l'objet utilisé? – fuzzygoat

+0

Un peu de catch-22. Avoir (id) expéditeur est un peu la convention pour que vous sachiez que le sélecteur appelé est un gestionnaire pour une action pour setTarget, pour un mouvement de contrôle de clic/curseur, etc. –

+0

Merci, très apprécié – fuzzygoat