NSTextField事件并辞职第一响应者

时间:2011-08-02 15:20:21

标签: objective-c macos nstextfield nstextview first-responder

我想实现一个NSTextField,当我点击它时,它会选择所有文本。 (为了让用户轻松删除所有当前文本) 当我完成编辑后,通过按Enter / tab或将鼠标移动到其矩形之外,我会将焦点移出场,并将其alpha值更改为0.5。

我的代码:

H档:

#import <Foundation/Foundation.h>

@interface MoodMsgTextField : NSTextField<NSTextFieldDelegate>

@end

M档案:

-(BOOL) becomeFirstResponder
{    
    NSLog(@"become first responder");

    BOOL result = [super becomeFirstResponder];
    if(result)
    {
        [self setAlphaValue:1.0];
        [self performSelector:@selector(selectText:) withObject:self afterDelay:0];
    }
    return result;
}

-(BOOL) refusesFirstResponder
{
    return NO;
}

-(BOOL) resignFirstResponder
{
    NSLog(@"resigning first responder");

    BOOL result = [super resignFirstResponder];

    NSText* fieldEditor = [self.window fieldEditor:YES forObject:self];
    [fieldEditor setSelectedRange:NSMakeRange(0,0)];
    [fieldEditor setNeedsDisplay:YES];

    [self setAlphaValue:0.5];

    return  result;
}

-(void)awakeFromNib
{
    self.delegate = self;

    [self setAlphaValue:0.5];    
    [self setBordered:YES];
    [self setWantsLayer:YES];
    self.layer.borderWidth = 0.5;
    self.layer.borderColor = [[NSColor grayColor] CGColor];        
}

- (void)controlTextDidChange:(NSNotification *)aNotification
{    
    NSLog(@"the text is %@",self.stringValue);
}

- (void)controlTextDidEndEditing:(NSNotification *)aNotification
{
    NSLog(@"end editiing : the text is %@",self.stringValue);
    [self.window makeFirstResponder:nil];
}

- (void)mouseEntered:(NSEvent *)theEvent
{
    [self setWantsLayer:YES];
    self.layer.borderWidth = 0.5;
    self.layer.borderColor = [[NSColor grayColor] CGColor];        
}
- (void)mouseExited:(NSEvent *)theEvent
{
    [self setWantsLayer:YES];
    self.layer.borderWidth = 0;
}

所以,我有一些问题:

1

当我在NSTextField内部按下时(当焦点在外面时)它会立即变为并且终止第一个响应者并且我得到编辑结束消息。这是为什么 ? 我点击的日志是:

2011-08-02 18:03:19.044 ooVoo[42415:707] become first responder
2011-08-02 18:03:19.045 ooVoo[42415:707] resigning first responder
2011-08-02 18:03:19.104 ooVoo[42415:707] end editing : the text is 

2

当我按下回车键时,它只选择里面的所有文字而不移动鼠标焦点。当我按下选项卡似乎确实移动了焦点,但是这两个都没有导致resignFirstResponder被调用。为什么?

第3 没有调用任何鼠标事件函数。我是否需要为此做一些特别的事情?我认为既然它们是NSResponder的那些,我将通过继承NSTextField免费获得这些。我在这里也需要NSTrackingInfo吗?

4

最后但并非最不重要的是,出于某种原因,每一对情书,一个字母似乎都是大胆的。 我不明白为什么。

我很感激任何帮助。 感谢

1 个答案:

答案 0 :(得分:5)

  1. 我不确定为什么会出现这种情况,但您应该阅读Field Editor概念。基本上,NSTextField不处理自己的输入,但使用称为字段编辑器的NSTextView来接受输入。

  2. 您需要自己对Enter键做出反应。看看key handling documentation。这是answer with an example

  3. 要获取鼠标事件,您可以使用NSTrackingArea。请参阅Mouse Tracking的文档。

  4. 我对此没有任何意见,除非有时文字绘图看起来很粗体,因为正在发生的事情是多次绘制文本而不删除背景。