2012-05-14 2 views
4

Сценарий:метод действия NSDatePicker не стреляя

пользователь вводит дату в качестве NSDatePicker в его текстовом виде, без шаговых (на OS X), и когда они ударяют вернуться на клавиатуре, я хотел бы сообщение, которое будет отправлено контроллеру.

В NSTextField я бы просто подключил действие в Interface Builder или установил его из кода, и когда пользователь нажимает Enter, сообщение о действии отправляется в цель.

Выбор даты позволяет установить сообщение о действии и цель, но я не могу заставить действие стрелять. Когда я нажимаю enter в команде выбора даты, сообщение о действии не вызывается.

Я что-то не так, или есть обходной путь, который я должен использовать? Я бы не стал отрицательным подклассифицировать любой из участвующих классов, если это то, что требуется.

ответ

5

NSDatePicker не будет обрабатывать или пересылать события клавиш, вызванные клавишей Return или Enter.

Решение подкласс NSDatePicker, чтобы получить желаемое поведение в KeyDown:

#import "datePickerClass.h" 

@implementation datePickerClass 
- (void)keyDown:(NSEvent *)theEvent{ 
    unsigned short n = [theEvent keyCode]; 
    if (n == 36 || n == 76) { 
     NSLog(@"Return key or Enter key"); 
     // do your action 
     // 
    } else { 
     [super keyDown:theEvent];// normal behavior 
    } 
} 
@end 

Вот так.

Edit: Также вы можете использовать NSCarriageReturnCharacter и NSEnterCharacter

NSString* const s = [theEvent charactersIgnoringModifiers]; 
unichar const key = [s characterAtIndex:0]; 
if (key == NSCarriageReturnCharacter || key == NSEnterCharacter) { 
+0

Выглядит просто и красиво. Поскольку Apple где-то в своих документах упоминает о поиске решений в делегатах, форматировщиках и т. Д., Прежде чем прибегать к «keyDown:», я надеялся, что будет другое решение, но по крайней мере это просто. Немного поискового запроса привело к Events.h, где есть даже официальные константы, определенные для 36 и 76. Полезные комментарии в этом файле указывают, что 76 для ключа Enter не гарантированно работают на клавиатурах, отличных от ANSI, поэтому я думаю, Просто используйте kVK_Return, который гарантированно работает на всех клавиатурах. – Monolo

+0

также вы можете использовать ** NSCarriageReturnCharacter ** и ** NSEnterCharacter **, я редактирую свой ответ – jackjr300