3

クリックするとすべてのテキストが選択される NSTextField を実装したいと思います。(ユーザーが現在のすべてのテキストを簡単に削除できるようにするため) Enter/Tab を押すかマウスを四角形の外に移動して編集を終了したら、フォーカスをフィールドの外に移動し、アルファ値を次のように変更します。 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 キーを押すと、内部のすべてのテキストが選択されるだけで、マウスのフォーカスは移動しません。タブを押すとフォーカスが移動するように見えますが、どちらの場合も rejectFirstResponder が呼び出されません。なんで ?

3. マウス イベント関数が呼び出されていません。そのために何か特別なことをする必要がありますか? NSResponder のものなので、NSTextField から継承して無料で取得しようと思いました。ここでも NSTrackingInfo が必要ですか?

4.

最後になりましたが、何らかの理由で、2 文字ごとに 1 文字が太字に見えます。理由がわかりません。

助けていただければ幸いです。ありがとう

4

1 に答える 1

5
  1. この場合、なぜこれが起こっているのかわかりませんが、フィールド エディターの概念について読む必要があります。基本的に、NSTextField は独自の入力を処理しませんが、フィールド エディターと呼ばれる NSTextView を使用して入力を受け入れます。

  2. 自分で Enter キーに反応する必要があります。の取り扱いに関するドキュメントをご覧ください。ここに例を挙げた答えがあります

  3. マウス イベントを取得するには、NSTrackingArea を使用できます。Mouse Trackingのドキュメントを参照してください。

  4. 背景を消去せずにテキストが複数回描画されていることが実際に起こっているときに、テキスト描画が太字に見えることがあることを除いて、これについては何も入力していません。

于 2011-08-02T17:00:02.447 に答える