9

我有一个 NSTextField,我想启用“as-you-type”拼写检查。当我加载我的应用程序时,我可以从菜单栏 > 编辑 > 拼写和语法 > 键入时检查拼写。

我希望默认启用此选项。在 IB 中,我可以为 NSTextView 启用此功能,但我想将 NSTextField 用于 UI 的这一部分。

谢谢你。

更新: 有谁知道是否可以在 Objective-C 代码的 NSTextField 上以编程方式运行菜单栏 > 编辑 > 拼写和语法 > 键入时检查拼写选项?似乎 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 ?

以上输出如下,不知道为什么target为null

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];
4

2 回答 2

4

你很幸运,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];
于 2010-05-13T08:31:24.757 回答
1

您是否尝试过利用 NSTextField 委托方法 textDidChange: 并调用:

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

每一次?

于 2010-05-13T08:23:46.790 回答