簡體   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