Ответ 1
Вам нужно указать в окне удалить статус первого ответчика из элемента управления:
[[textField window] makeFirstResponder:nil];
Это закончит редактирование и удаление фокуса из текстового поля.
У меня есть gui, основанный на представлении, который содержит текстовое поле для каждого элемента gui. Когда я выбираю другой пункт меню, я хочу, чтобы мои текстовые поля выходили из режима редактирования. Я все равно не мог найти это в документах nsTextField. Есть идеи?
Вам нужно указать в окне удалить статус первого ответчика из элемента управления:
[[textField window] makeFirstResponder:nil];
Это закончит редактирование и удаление фокуса из текстового поля.
Следующее решение от 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:)
Я знаю, что это старый вопрос, но если кто-то задается вопросом о быстром 3, он работает только для меня с помощью
DispatchQueue.main.async{
self.window?.makeFirstResponder()
}