Как включить проверку орфографии в 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];
2 ответа
Вам повезло, Apple предоставляет класс проверки орфографии: NSSpellChecker:
Используя это, вы можете проверять орфографию каждый раз, когда пользователь обновляет текст, используя метод делегата 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];
Вы пытались подключиться к методу делегата NSTextField textDidChange: и вызова:
range = [[NSSpellChecker sharedSpellChecker] checkSpellingOfString:aString startingAt:0];
каждый раз?