Принудительное завершение редактирования текстового поля Какао - PullRequest
18 голосов
/ 17 февраля 2010

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

Ответы [ 4 ]

48 голосов
/ 18 февраля 2010

Необходимо указать окну, чтобы удалить статус первого респондента из элемента управления:

[[textField window] makeFirstResponder:nil];

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

11 голосов
/ 28 мая 2015

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

6 голосов
/ 10 февраля 2017

я знаю, что это старый вопрос, но в случае, если кто-то задается вопросом о swift 3, он работал только для меня с

DispatchQueue.main.async {
    self.window?.makeFirstResponder()
}

Быстрое обновление 4.2, nil делает окно первым респондентом. В противном случае выдает ошибку.

DispatchQueue.main.async {
    self.window?.makeFirstResponder(nil)
}
0 голосов
/ 12 февраля 2018

Эта команда должна использоваться в viewWillLayout и, если необходимо, в viewWillAppear и.И это все.Нет подклассов и параллельных потоков.

[textField.window makeFirstResponder:nil];

Это хорошо работает с главным окном.Но это не работает с модальными окнами.

Для модальных окон используйте viewDidAppear или dispatch_async:

dispatch_async(dispatch_get_main_queue(), ^{
        [textField.window makeFirstResponder:nil];
    });
...