5

我正在尝试回应 aclick内的textfield. 当点击发生时,我将打开一个panel. 我最初的想法是使用一种delegate方法来响应click事件 - 但我发现:

此方法不起作用:

(void)textDidBeginEditing:(NSNotification *)aNotification

此方法确实有效,但仅在我实际编辑文本字段中的文本时才有效,而不是在我第一次单击它时。而且 - 如果我再次编辑文本,此方法将停止工作:

(void)controlTextDidBeginEditing:(NSNotification *)aNotification

我可以使用尽可能多的细节——或者理想情况下的代码示例。我知道 annstextfield继承自NSControl,它有一个mouseDown事件。是否也有类似的方法来响应事件textfield

4

2 回答 2

11

由于NSTextField继承自NSControl类,它也继承了-(void)mouseDown:(NSEvent*) theEvent方法。

于 2009-03-26T05:50:30.367 回答
9

我今天点击它时需要NSTextField调用一个委托函数,并认为这个基本代码可能有用。请注意,NSTextField已经有一个委托,并且在 SDK v10.6 中,委托已经有一个与之关联的协议。请注意,如果您不关心协议、编译器警告等,则不需要协议和属性声明或 getter 和 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");
  ...
}
...

如果您使用 10.5 SDK 构建,请不要让协议继承自NSTextFieldDelegate.

于 2010-12-17T17:50:54.940 回答