繁体   English   中英

NSTextField事件并退出第一响应者

[英]NSTextField events and resigning 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。

当我按下Enter键时,它只会选择其中的所有文本,并且不会移动鼠标焦点。 当我按下选项卡时,似乎确实会移动焦点,但是两者都不引起resignFirstResponder的调用。 为什么呢

3.没有任何鼠标事件函数被调用。 我需要为此做些特别的事情吗? 我以为,由于它们是NSResponder的,所以我将通过从NSTextField继承免费获得它们。 我在这里也需要NSTrackingInfo吗?

4。

最后但并非最不重要的一点,由于某种原因,每隔几个字母,一个字母似乎是粗体的。 我不知道为什么。

我将不胜感激。 谢谢

  1. 我不确定在这种情况下为什么会发生这种情况,但是您应该阅读有关字段编辑器概念的信息。 基本上,NSTextField不会处理自己的输入,而是使用称为字段编辑器的NSTextView来接受输入。

  2. 您需要自己对Enter键做出反应。 看一下密钥处理文档 这是一个例子答案

  3. 要获取鼠标事件,可以使用NSTrackingArea。 请参阅文档“ 鼠标跟踪”

  4. 我对此没有任何输入,只是有时当实际发生的情况是多次绘制文本而不擦除背景时,文本绘制可能显得粗体。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM