objective-c - NSTextField 事件和辞职第一响应者

标签 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. 我不确定为什么在这种情况下会发生这种情况,但您应该阅读 Field Editor概念。基本上 NSTextField 不处理自己的输入,而是使用称为字段编辑器的 NSTextView 来接受输入。

  2. 您需要自己对 Enter 键使用react。看看 key handling documentation .这是一个 answer with an example .

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

  4. 我对此没有任何意见,除了有时文本绘制看起来很粗,而实际上发生的是多次绘制文本而不删除背景。

关于objective-c - NSTextField 事件和辞职第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6914409/

相关文章:

iOS 9 : Gesture Recognizer was setup in a storyboard/xib to be added to more than one view (not working)

cocoa - cocoa 中的自定义列表控件

objective-c - 将 NSTextField 转换为 Label

objective-c - 通过终端在 Cocoa 应用程序中进行语音

java - 断言不起作用

objective-c - NSTextField 底部对齐

iphone - 如何接收连接类型已更改的通知(3G、Edge、Wifi、GPRS)

iphone - 将 CGcolorRef 转换为 UIColor

iphone - 我可以将 ObjectiveC @selector 放入 NSDictionary 中吗?

objective-c - 查找适当的 key 以用于验证与 Objective-C 的 SSH 连接