Уведомления делегата NSTextField, как получить текст?

Я пытался научиться использовать Xcode, но не могу понять, как зарегистрировать, что NSTextField изменилось. По сути, у меня есть NSTextField и кнопка. Щелчок по кнопке делает что-то с текстом в поле. Однако я хочу иметь возможность получать текст поля без необходимости использовать текстовое поле «Действие: отправить после редактирования». То есть я хочу иметь возможность вводить текст и сразу же нажимать кнопку, не нажимая Enter и не выходя из текстового поля. Похоже, что это можно сделать, установив делегат для моего NSTextField, который отвечает на

- (void)controlTextDidChange:(NSNotification *)aNotification

Но я не понимаю, как получить введенный текст. Я предполагаю, что это как-то связано с

[[aNotification userInfo] valueForKey:@"NSFieldEditor"];

но я действительно понятия не имею, куда идти оттуда.


person Daniel    schedule 11.05.2011    source источник


Ответы (3)


Вы на правильном пути! Объект, который вы получаете из информационного словаря уведомлений, — это редактор полей., который представляет собой просто NSTextView, обрабатывающий ввод текста от имени текстового поля.

Когда у вас есть этот объект, все, что вам нужно сделать, это запросить его textStorage, который представляет собой NSTextStorage* объект, содержащий текст. Этот объект, в свою очередь, имеет свой string, который представляет собой старый добрый NSString, содержащий только символы.

NSTextView * fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
NSString * theString = [[fieldEditor textStorage] string];

*Подкласс NSAttributedString, который представляет собой объект, содержащий строку и связанные с ней «атрибуты», такие как цвет, шрифт и подчеркивание.

person jscs    schedule 11.05.2011
comment
Могу я предложить -objectForKey: вместо -valueForKey:? Первый — это канонический метод получения значения из словаря. - person ; 12.05.2011
comment
@Bavarious: Ты как всегда прав! Виновен здесь в том, что скопировал строку кода ОП, не прочитав ее внимательно. - person jscs; 12.05.2011

В методе действия кнопки просто прочитайте текущее строковое значение в текстовом поле:

- (IBAction)didClickTheButton:(id)sender {

    NSString* theString = [myTextField stringValue];

    // do something with theString

}
person Darren    schedule 11.05.2011
comment
Вау, это намного проще. Почему другой ответ, который кажется таким запутанным, в настоящее время оценивается выше? - person SilverSideDown; 03.10.2012
comment
@SilverSideDown По крайней мере, когда я задавал вопрос, это не регистрировало текст, который был введен без нажатия пользователем табуляции или нажатия клавиши возврата. - person Daniel; 17.10.2012
comment
Если вы используете привязки данных, вы можете установить параметр «Непрерывно обновляет значение», и это будет обновлять связанное значение по мере ввода без необходимости нажимать «Ввод» или «Tab». Вызов метода -stringValue вернет текущий текст в NSTextField в любом случае. - person Darren; 17.10.2012
comment
Ответ Даррена - лучший и на самом деле не требует кодирования, кроме объявления ивара. Работает без проблем в 2016 году со Swift! ;) Спасибо друг! - person Karoly Nyisztor; 04.01.2016

Если вы когда-либо работали только с одним текстовым полем, это может быть проще:

- (void)controlTextDidChange:(NSNotification *)obj {
    [self.inputField stringValue];
}

Я полностью игнорирую все сложные детали NSText и тому подобного и просто использую простоту отправляемого уведомления и простоту получения строкового значения из текстового поля.

person ArtOfWarfare    schedule 25.01.2014