selectText NSTextField на фокусе

Мог кто-либо предлагать, чтобы метод выбрал весь текст NSTextField когда пользователь нажимает его?

Я действительно находил, что предложения разделили на подклассы NSTextField и затем используйте mouseDown или firstResponder,' но это вне моего навыка на данный момент. Таким образом, я надеялся или будет более легкое решение, или кто-то мог бы быть достаточно любезным для детализации требуемых шагов.

11
задан dandan78 5 September 2013 в 10:06
поделиться

1 ответ

Нет более простого решения, чтобы сделать то, что вы хотите, вам нужно подкласс NSTextField . Вам нужно научиться работать с подклассами, если вы хотите сделать что-то полезное в Cocoa.

Текстовые поля могут быть относительно сложными для подклассов, поскольку NSTextField использует отдельный объект NSTextView, называемый Редактором полей, для работы с собственно редактированием. Этот текстовый вид возвращается объектом NSWindow для NSTextField и повторно используется для всех текстовых полей на странице.

Как и любой подкласс NSResponder, NSTextField отвечает на методы -принимаетFirstResponder и -бываетFirstResponder. Они вызываются, когда окно хочет сфокусировать внимание на определенном элементе управления или просмотре. Если вернуть YES из обоих этих методов, то ваш элемент управления/представления будет иметь статус первого отвечающего, что означает, что это активный элемент управления. Однако, как уже упоминалось, NSTextField при нажатии на него фактически предоставляет редактору полей статус первого отвечающего, поэтому необходимо сделать что-либо подобное в подклассе NSTextField:

@implementation MCTextField
- (BOOL)becomeFirstResponder
{
    BOOL result = [super becomeFirstResponder];
    if(result)
        [self performSelector:@selector(selectText:) withObject:self afterDelay:0];
    return result;
}
@end

Это первый вызов реализации суперкласса -becomeFirstResponder, который выполнит сложную работу по управлению редактором полей. Затем вызывается -selectText:, который выбирает весь текст в поле, но делает это с задержкой в 0 секунд, что откладывает выполнение следующего цикла обработки событий. Это означает, что выделение произойдет после полной настройки редактора полей.

23
ответ дан 3 December 2019 в 02:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: