2009-03-26 9 views
5

J'essaie de répondre à un click dans un textfield. Lorsque le clic se produit, je vais ouvrir un panel. Ma première pensée était d'utiliser une méthode delegate pour répondre à l'événement click - mais je trouve que:Quelle méthode de délégation dois-je utiliser pour répondre aux clics sur un objet NSTextField?

Cette méthode ne fonctionne pas:

(void)textDidBeginEditing:(NSNotification *)aNotification 

Cette méthode ne travail, mais seulement quand je en fait modifier le texte dans le champ de texte, pas lorsque je clique dessus. Et - si je modifier le texte une deuxième fois, cette méthode ne fonctionne plus:

(void)controlTextDidBeginEditing:(NSNotification *)aNotification 

je pourrais utiliser autant de détails que possible - ou un exemple de code, idéalement. Je sais qu'un nstextfield hérite de NSControl, qui a un événement mouseDown. Existe-t-il une manière similaire de répondre à l'événement avec un textfield, aussi?

+0

Duplicata de: http://stackoverflow.com/questions/680863/qui-delegate-method-i-should-use-to-respond-to-clicks-on-a-text-field – Darron

+0

Je suis d'accord avec vous , mais en lisant l'autre question, il semble que ce n'est pas le cas. Ceci est une question de Mac; l'autre est une question iPhone. –

+0

Oui, je pense que c'est ma question, je l'ai mis erreur emplacement avant. Désolé! – jin

Répondre

10

Puisque NSTextField hérite de la classe NSControl, il hérite également de la méthode -(void)mouseDown:(NSEvent*) theEvent.

+0

J'ai trouvé que nstextfield héritait de la classe NSControl, j'ai aussi trouvé que la classe NSController avait la méthode mouseDown, mais je ne sais pas comment l'utiliser dans mon fichier, merci beaucoup. – jin

+0

Vous pouvez simplement passer outre l'événement mouseDown dans la classe NSTextField, comme suit: @implementation NSTextField - (void) mouseDown: (NSEvent *) {theEvent // votre code ici} @end – locriani

+1

remplaçant mouseDown: est pas assez pour NSTextField modifiable, car une fois que l'éditeur de champ (un NSTextView *) est activé dans le champ de texte, il est "front" et il obtient le mouseDown: events! Donc mouseDown: va fonctionner une fois, mais pas plusieurs fois de suite ... Et surcharger mouseDown: dans l'éditeur de champ est * très * difficile. – Altimac

8

Je devais avoir un NSTextField appeler une fonction de délégué en cliquant dessus aujourd'hui, et j'ai pensé que ce code de base pourrait être utile. Notez que NSTextField a déjà un délégué et que dans le SDK v10.6, le délégué a déjà un protocole associé. Notez que si vous ne vous souciez pas des protocoles, des avertissements du compilateur, etc., vous n'avez pas besoin des déclarations de protocole et de propriété ni du getter et du setter.

MouseDownTextField.h: 

#import <Appkit/Appkit.h> 
@class MouseDownTextField; 

@protocol MouseDownTextFieldDelegate <NSTextFieldDelegate> 
-(void) mouseDownTextFieldClicked:(MouseDownTextField *)textField; 
@end 

@interface MouseDownTextField: NSTextField { 
} 
@property(assign) id<MouseDownTextFieldDelegate> delegate; 
@end 

MouseDownTextField.m: 
#import "MouseDownTextField.h" 

@implementation MouseDownTextField 
-(void)mouseDown:(NSEvent *)event { 
    [self.delegate mouseDownTextFieldClicked:self]; 
} 

-(void)setDelegate:(id<MouseDownTextFieldDelegate>)delegate { 
    [super setDelegate:delegate]; 
} 

-(id)delegate { 
    return [super delegate]; 
} 

AppDelegate.h: 
@interface AppDelegate <MouseDownTextFieldDelegate> 
... 
@property IBOutlet MouseDownTextField *textField; 
... 

AppDelegate.m: 
... 
    self.textField.delegate = self; 
... 
-(void)mouseDownTextFieldClicked:(MouseDownTextField *)textField { 
    NSLog(@"Clicked"); 
    ... 
} 
... 

Si vous construisez avec 10.5 SDK, n'ont pas Hériter du protocole de NSTextFieldDelegate.

Questions connexes