2010-05-13 211 views
9

我有一個NSTextField,我想啓用「as-you-type」拼寫檢查。當我加載我的應用程序時,我可以從菜單欄中執行此操作>編輯>拼寫和語法>在鍵入時檢查拼寫。如何在Mac OS X的NSTextField中啓用拼寫檢查?

我想這個選項默認啓用。在IB內部,我可以爲NSTextView啓用此功能,但是我想爲這部分用戶界面使用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) 

SOLUTION

下面是針對此問題解決辦法,如果任何人都需要知道。一些NSLogging告訴我,在將NSTextField設置爲firstResponder之後,firstResponder實際上包含一個NSTextView,然後可以啓用拼寫。我假設NSTextField在包含響應者的子視圖中包含一個NSTextView,實際上這應該暴露在NSTextField類中。

// Focus TextField 
[textField becomeFirstResponder]; 

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

出現的'NSTextView'被稱爲字段編輯器。如果這個'firstResponder'轉換太脆弱了,你可以在'NSWindowController'中重寫'-windowWillReturnFieldEditor:forObject:',並在那裏改變設置。 – ctietze 2017-06-13 07:28:06

回答

4

你很幸運,蘋果提供了一個拼寫檢查類: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]; 
+0

這似乎並不表明我如何從編輯菜單中啓用「即用型」拼寫檢查。我在這裏錯過了什麼? – Luke 2010-05-13 08:35:54

+0

查看更新回答 – pheelicks 2010-05-13 09:36:52

+0

那麼NSTextView不支持Focus Ring屬性,我不想重新發明這種情況。我不明白爲什麼我無法以編程方式在使用NSTextField時在「編輯」>「拼寫和語法」菜單中打開我可以訪問的「拼寫」選項。不應該有辦法通過Obj-C代碼打開該選項嗎? – Luke 2010-05-13 10:59:27

1

您是否嘗試過進入割膠的NSTextField委託方法textDidChange: 和調用:

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

每一次?

+0

我指的是NSTextField而不是UITextField。這是一個Mac OS X桌面問題。 – Luke 2010-05-13 08:28:48

+0

我希望有比使用textDidChange更好的東西。我注意到默認的菜單欄被連接到了toggleAutomaticSpellingCorrection:在編輯>拼寫和語法>在拼寫時檢查拼寫選項。該應用程序運行後,該菜單選項可與NSTextField配合使用。我想知道如何啓用這個官方選項,認爲Obj-C代碼。 – Luke 2010-05-13 08:50:47

+0

您可能想從您的答案中刪除錯誤的iPhone建議,因此它不會顯示在Google中。 – Luke 2010-05-13 13:12:57