События NSTextField и отставка первого респондента - PullRequest
2 голосов
/ 02 августа 2011

Я хочу реализовать 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.

Когда я нажимаю клавишу ввода, он просто выделяет весь текст внутри и не перемещаетфокус мыши.Когда я нажимаю на вкладку, кажется, что смещение фокуса, но ни один из двух не вызывает вызывается resignFirstResponder.Почему?

3. Ни одна из функций событий мыши не вызывается.Нужно ли делать что-то особенное для этого?Я думал, что, поскольку они принадлежат NSResponder, я получу их бесплатно, унаследовав от NSTextField.Нужно ли здесь также использовать NSTrackingInfo?

4.

И последнее, но не менее важное: по какой-то причине из каждой пары букв одна буква выделяется жирным шрифтом.Понятия не имею почему.

Буду признателен за любую помощь.Спасибо

1 Ответ

5 голосов
/ 02 августа 2011
  1. Я не уверен, почему это происходит в этом случае, но вы должны прочитать о концепции Field Editor . По сути, NSTextField не обрабатывает свой собственный ввод, но использует NSTextView, называемый редактором полей, для приема ввода.

  2. Вам нужно самостоятельно отреагировать на клавишу Enter. Ознакомьтесь с документацией по обработке ключей . Вот ответ с примером .

  3. Для получения событий мыши вы можете использовать NSTrackingArea. См. Документы для Отслеживание мыши .

  4. У меня нет никаких данных, за исключением того, что иногда рисование текста может выглядеть жирным, когда на самом деле происходит то, что текст рисуется несколько раз без стирания фона.

...