Как включить проверку орфографии в NSTextField в Mac OS X? - PullRequest
9 голосов
/ 13 мая 2010

У меня есть 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)

1024 * РЕШЕНИЕ *

Ниже приведено решение этой проблемы, если кому-то еще нужно знать. Некоторые 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 ]

4 голосов
/ 13 мая 2010

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

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

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

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

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

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

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

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

// Focus TextField
[textField becomeFirstResponder];

// Enable Continous Spelling
NSTextView *textView = (NSTextView *)[self.window firstResponder];
[textView setContinuousSpellCheckingEnabled:YES];
1 голос
/ 13 мая 2010

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

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

каждый раз?

...