我有一个NSTextField,希望实现“边输边检查”拼写功能。当我载入应用程序时,可以通过菜单栏 > 编辑 > 拼写与语法 > 边打字时检查来实现。
我希望默认启用此选项。在IB中,我可以为NSTextView启用此选项,但我想在UI的这一部分使用NSTextField。
谢谢。
更新: 有人知道是否可以从Objective-C代码中编程运行菜单栏 > 编辑 > 拼写与语法 > 边打字时检查NSTextField选项吗?似乎NSTextField支持“边打字时检查拼写”选项,只是没有办法从Obj-C启用该选项。
编辑 #1
我尝试手动启用菜单,但它没有起作用:
我希望默认启用此选项。在IB中,我可以为NSTextView启用此选项,但我想在UI的这一部分使用NSTextField。
谢谢。
更新: 有人知道是否可以从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?
上述代码输出了以下内容,不确定目标为什么为空。
App[3895:a0f] Menu: <NSMenuItem: 0x100135180 Check Spelling While Typing>
Current language: auto; currently objective-c
App[3895:a0f] Target: (null)
解决方案
如果有其他人需要解决这个问题,下面是解决方案。通过一些NSLog记录,我发现在将NSTextField设置为firstResponder后,firstResponder实际上包含一个NSTextView,您可以在其中启用拼写检查。我假设NSTextField包含一个NSTextView子视图,它接受响应者,真正的做法应该是在NSTextField类中公开它。
// Focus TextField
[textField becomeFirstResponder];
// Enable Continous Spelling
NSTextView *textView = (NSTextView *)[self.window firstResponder];
[textView setContinuousSpellCheckingEnabled:YES];
NSTextView
称为字段编辑器。如果这个firstResponder
转换太脆弱,您可以在NSWindowController
中覆盖-windowWillReturnFieldEditor:forObject:
并在那里更改设置。 - ctietze