Как включить проверку орфографии в NSTextField в Mac OS X?

У меня есть NSTextField, для которого я хотел бы включить проверку орфографии «по мере ввода». Когда я загружаю свое приложение, я могу сделать это из строки меню > «Правка» > «Правописание и грамматика» > «Проверить правописание при вводе».

Я бы хотел, чтобы эта опция была включена по умолчанию. В IB я могу включить это для NSTextView, но я хотел бы использовать NSTextField для этой части пользовательского интерфейса.

Спасибо.

Обновление: Кто-нибудь знает, можно ли программно запустить строку меню > Изменить > Орфография и грамматика > Проверить орфографию при вводе в NSTextField из кода Objective-C? Кажется, что NSTextField поддерживает опцию «Проверять орфографию при вводе», просто нет возможности включить эту опцию из Obj-C.

Изменить №1

Я попробовал следующее, чтобы вручную включить меню, и это не сработало:

// Focus TextField
[textField becomeFirstResponder];

// Enable Spell Checking
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenu *editMenu = [[mainMenu itemWithTitle:@"Edit"] submenu];
NSMenu *spellingMenu = [[editMenu itemWithTitle:@"Spelling and Grammar"] submenu];
NSMenuItem *autoSpellingMenuItem = [spellingMenu itemWithTitle:@"Check Spelling While Typing"];
[autoSpellingMenuItem setEnabled:YES];

NSLog(@"Menu: %@", [autoSpellingMenuItem description]);
NSLog(@"Target: %@", [[autoSpellingMenuItem target] description]);

// Actually perform menu action
[[autoSpellingMenuItem target] performSelector:[autoSpellingMenuItem action]];

Разве нельзя напрямую вызвать действие пункта меню, а не использовать setEnabled:YES ?

Вышеприведенное выводит следующее, не уверен, почему цель равна нулю

App[3895:a0f] Menu: <NSMenuItem: 0x100135180 Check Spelling While Typing>
Current language:  auto; currently objective-c
App[3895:a0f] Target: (null)

РЕШЕНИЕ

Ниже приведено решение этой проблемы, если кому-то еще нужно знать. Некоторые NSLogging показали мне, что после установки NSTextField в firstResponder firstResponder фактически содержит NSTextView, после чего вы можете включить правописание. Я предполагаю, что NSTextField содержит NSTextView в подпредставлениях, которые принимают ответчика, на самом деле это должно быть представлено в классе NSTextField.

// Focus TextField
[textField becomeFirstResponder];

// Enable Continous Spelling
NSTextView *textView = (NSTextView *)[self.window firstResponder];
[textView setContinuousSpellCheckingEnabled:YES];

person Luke    schedule 13.05.2010    source источник
comment
Появляющийся NSTextView называется редактором полей. Если эта отливка firstResponder слишком хрупкая, вы можете переопределить -windowWillReturnFieldEditor:forObject: в NSWindowController и изменить настройки там.   -  person ctietze    schedule 13.06.2017


Ответы (2)


Вам повезло, Apple предоставляет класс проверки орфографии: NSSpellChecker:

http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/SpellCheck/Concepts/SpellChecker.html

Используя это, вы можете проверять правописание каждый раз, когда пользователь обновляет текст, используя метод делегата textdidChange.

Также вы говорите, что хотите использовать NSTextField, а не NSTextView. Почему бы просто не использовать редактируемый NSTextView, где вы можете установить свойство toggleAutomaticSpellingCorrection?

РЕДАКТИРОВАТЬ:

Чтобы изменить значение пункта меню программно, сделайте что-нибудь вроде:

// Enable Spell Checking
NSMenu *mainMenu = [[NSApplication sharedApplication] mainMenu];
NSMenu *editMenu = [[mainMenu itemWithTitle:@"Edit"] submenu];
NSMenu *spellingMenu = [[editMenu itemWithTitle:@"Spelling and Grammar"] submenu];
NSMenuItem *autoSpellingMenuItem = [spellingMenu itemWithTitle:@"Check Spelling While Typing"];
[autoSpellingMenuItem setEnabled:YES];

// Actually perform menu action
[[autoSpellingMenuItem target] performSelector:[autoSpellingMenuItem action]];

РЕДАКТИРОВАТЬ:

Кажется, что приведенный выше метод на самом деле не запускает метод, как предполагается, и цель равна NULL (поскольку первый ответчик не был установлен?). Однако можно отправить сообщение напрямую, например:

// Focus TextField
[textField becomeFirstResponder];

// Enable Continous Spelling
NSTextView *textView = (NSTextView *)[self.window firstResponder];
[textView setContinuousSpellCheckingEnabled:YES];
person pheelicks    schedule 13.05.2010
comment
Похоже, это не указывает на то, как я могу включить проверку орфографии при вводе, как я могу из меню «Правка». Я что-то пропустил здесь? - person Luke; 13.05.2010
comment
Ну, NSTextView не поддерживает свойство Focus Ring, которое я не хотел заново изобретать для этой ситуации. Я действительно не понимаю, почему я не могу программно включить параметры правописания, к которым я могу получить доступ в меню «Правка» › «Правописание и грамматика» при использовании NSTextField. Разве не должен быть какой-то способ включить эту опцию через код Obj-C? - person Luke; 13.05.2010
comment
Кроме того, NSTextField может легко обрабатывать действие для события возврата. - person Luke; 13.05.2010
comment
Как насчет редактирования MainMenu.xib, чтобы установить параметр напрямую? Посмотреть изменить - person pheelicks; 13.05.2010
comment
Да, я пробовал это только что, и когда приложение загружается, пункт меню будет отключен независимо от того, что было настроено, как в IB. Разве я не могу запустить этот пункт меню с помощью кода? Я новичок в Objective-C, поэтому не знаю, с чего начать. - person Luke; 13.05.2010
comment
Попробуйте то, что у меня есть выше. Я не на 100% на 2-й строке (доступ к фактическому элементу), но я не могу проверить это, так как мой Mac сломан, но что-то из этого должно сработать для вас. - person pheelicks; 13.05.2010
comment
Я попробовал код после того, как изменил его для перемещения по меню. Все объекты были установлены, но setEnabled:YES не работал. Смотрите мое обновление № 1 в исходном вопросе. - person Luke; 13.05.2010
comment
Смотрите обновление. Кажется, setEnabled только устанавливает элемент, но фактически не выполняет действие. - person pheelicks; 13.05.2010
comment
Спасибо, я думаю, мы приближаемся. [[autoSpellingMenuItem target] PerformSelector:[autoSpellingMenuItem action]]; однако не запускает действие. Также setEnabled фактически не устанавливает флажок в MenuItem. В любом случае у MenuItem есть действие отправки ContinuousSpellChecking: подключенное к Первому ответчику. Есть ли способ запустить это действие без использования меню? - person Luke; 13.05.2010
comment
Кроме того, проверьте мое обновление № 1 еще раз в исходном вопросе. Кажется, что цель выводит null, однако объект MenuItem существует. - person Luke; 13.05.2010
comment
Узнайте, что ваш первый ответчик (stackoverflow.com/questions/1823317/), а затем отправить ему сообщение: [firstResponder ContinuousSpellChecking:YES] ; ? - person pheelicks; 13.05.2010
comment
Некоторые NSLogging показали мне, что после установки NSTextField в firstResponder firstResponder фактически содержит NSTextView, после чего вы можете включить правописание. Смотрите решение в исходном вопросе. Я предполагаю, что NSTextField содержит NSTextView в подпредставлениях, которые принимают ответчика, на самом деле это должно быть представлено в классе NSTextField. - person Luke; 13.05.2010
comment
Спасибо за вашу помощь! Добавьте решение в свой ответ, и я отмечу вас как ответ. - person Luke; 13.05.2010

Вы пытались подключиться к методу делегата NSTextField textDidChange: и вызвать:

range = [[NSSpellChecker sharedSpellChecker] checkSpellingOfString:aString startingAt:0];

каждый раз?

person gnasher    schedule 13.05.2010
comment
Я имею в виду NSTextField, а не UITextField. Это вопрос рабочего стола Mac OS X. - person Luke; 13.05.2010
comment
Я надеялся, что есть что-то лучше, чем использование textDidChange. Я заметил, что строка меню по умолчанию подключена к переключателю «Автоматическая коррекция орфографии: в меню «Правка» > «Правописание и грамматика» > «Проверка орфографии при вводе». Этот пункт меню работает с NSTextField после запуска приложения. Я хотел бы знать, как включить эту официальную опцию с помощью кода Obj-C. - person Luke; 13.05.2010
comment
Возможно, вы захотите удалить неверное предложение iPhone из своего ответа, чтобы оно не отображалось в Google. - person Luke; 13.05.2010