Какой метод делегата мне следует использовать для ответа на клики в NSTextField? - PullRequest
5 голосов
/ 26 марта 2009

Я пытаюсь ответить на click в пределах textfield. Когда произойдет щелчок, я собираюсь открыть panel. Сначала я думал использовать метод delegate для ответа на событие click, но я обнаружил, что:

Этот метод не работает:

(void)textDidBeginEditing:(NSNotification *)aNotification

Этот метод работает , но только когда я на самом деле редактирую текст в текстовом поле, а не когда я впервые щелкаю по нему. И - если я редактирую текст во второй раз, этот метод перестает работать:

(void)controlTextDidBeginEditing:(NSNotification *)aNotification

Я мог бы использовать как можно больше деталей - или, в идеале, пример кода. Я знаю, что nstextfield наследуется от NSControl, который имеет событие mouseDown. Есть ли подобный способ ответить на событие также textfield?

Ответы [ 2 ]

10 голосов
/ 26 марта 2009

Поскольку NSTextField наследуется от класса NSControl, он также наследует метод -(void)mouseDown:(NSEvent*) theEvent.

8 голосов
/ 17 декабря 2010

Мне нужно было NSTextField вызвать делегатскую функцию после нажатия на нее сегодня, и я подумал, что этот базовый код может быть полезен. Обратите внимание, что у NSTextField уже есть делегат, и что в SDK v10.6 делегат уже имеет связанный с ним протокол. Обратите внимание: если вам не нужны протоколы, предупреждения компилятора и т. Д., Вам не нужны объявления протоколов и свойств или методы получения и установки.

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");
  ...
}
...

Если вы строите с 10.5 SDK, не наследуйте протокол от NSTextFieldDelegate.

...