Следующее решение от cocoabuilder.com - Остановить сеанс редактирования с помощью NSTextField работает для меня как на OS X 10.9 и OS X 10.10 для Objective-C, так и на 10.10 для Swift.
Вот версия Objective-C:
@implementation CustomTextField
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
self.target = self;
self.action = @selector(action:);
return self;
}
- (void)action:(NSTextField *)textField {
// Make something else first responder, something neutral
// (or can be a fake invisible element)
[self.window makeFirstResponder:self.window.contentView];
// Other code
}
@end
Справочная информация: принятое решение в этой теме никогда не работало для меня на OS X 10.9 и 10.10, поэтому вместо вызова [[textField window] makeFirstResponder:nil];
, как следует из предложенного - мне нужно было вызвать makeFirstResponder
с некоторым ненулевым подклассом NSResponder (это может быть либо Представление содержимого NSWindow или представление NSViewController, которые оба работают в моем случае, или какое-то поддельное представление NSTextField, которое невидимо для пользователя в более сложных случаях).
Важная деталь: -[NSWindow makeFirstResponder]
должен вызываться точно в селекторе действий NSTextField, как показано в моем примере. Ни одно другое место в конвейере метода NSTextField не работало для меня (textDidEndEditing :, textShouldEndEditing: или control: textShouldEndEditing:)