Принуждение текстового поля Cocoa для завершения редактирования

У меня есть gui, основанный на представлении, который содержит текстовое поле для каждого элемента gui. Когда я выбираю другой пункт меню, я хочу, чтобы мои текстовые поля выходили из режима редактирования. Я все равно не мог найти это в документах nsTextField. Есть идеи?

Ответы

Ответ 1

Вам нужно указать в окне удалить статус первого ответчика из элемента управления:

[[textField window] makeFirstResponder:nil];

Это закончит редактирование и удаление фокуса из текстового поля.

Ответ 2

Следующее решение от 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

Я знаю, что это старый вопрос, но если кто-то задается вопросом о быстром 3, он работает только для меня с помощью DispatchQueue.main.async{ self.window?.makeFirstResponder() }