2010-05-13 9 views
9

Tengo un NSTextField que me gustaría habilitar el corrector ortográfico "as-you-type". Cuando cargo mi aplicación, puedo hacerlo desde la barra de menú> Editar> Ortografía y gramática> Verificar ortografía mientras escribo.¿Cómo habilito la revisión ortográfica dentro de un NSTextField en Mac OS X?

Me gustaría que esta opción esté habilitada de forma predeterminada. Dentro de IB puedo habilitar esto para un NSTextView, pero me gustaría usar NSTextField para esta parte de la UI.

Gracias.

Actualización: ¿Alguien sabe si es posible ejecutar mediante programación la barra de Menú> Editar> Ortografía y gramática> Comprobar ortografía al escribir en la opción NSTextField a partir del código de Objective-C? Parece que NSTextField admite la opción "Comprobar ortografía al escribir", simplemente no hay forma de habilitar la opción desde Obj-C.

Edición # 1

He intentado lo siguiente para activar manualmente el menú y no funcionó:

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

No es posible llamar directamente a la acción elemento de menú en lugar de utilizar el setEnabled: SÍ?

Las salidas superiores a la siguiente, sin saber por qué la meta es nulo

App[3895:a0f] Menu: <NSMenuItem: 0x100135180 Check Spelling While Typing> 
Current language: auto; currently objective-c 
App[3895:a0f] Target: (null) 

SOLUCIÓN

A continuación se muestra la solución para este problema si alguien más necesita saber. Algunos NSLogging me mostraron que después de configurar el NSTextField en firstResponder, el firstResponder en realidad contiene un NSTextView, luego puedes habilitar la ortografía. Supongo que el NSTextField contiene un NSTextView en las subvistas que toma el respondedor, realmente esto debería estar expuesto en la clase NSTextField.

// Focus TextField 
[textField becomeFirstResponder]; 

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

El 'NSTextView' que aparece se llama el editor de campo. Si esta conversión 'firstResponder' es demasiado frágil, puede anular' -windowWillReturnFieldEditor: forObject: 'en' NSWindowController' y cambiar la configuración allí. – ctietze

Respuesta

4

Estás de suerte, Apple proporciona una clase corrector ortográfico: NSSpellChecker:

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

El uso de este se puede comprobar el la ortografía cada vez que el usuario actualiza el texto utilizando el método delegado textdidChange.

También dices que quieres usar NSTextField en lugar de NSTextView. ¿Por qué no usar simplemente un NSTextView editable donde puede establecer la propiedad toggleAutomaticSpellingCorrection?

EDIT:

Para cambiar el valor del elemento de menú mediante programación hacer algo a lo largo de las líneas de:

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

EDIT:

Parece que el método anterior en realidad no disparar el método como se supone que debe hacerlo y el objetivo es NULO (¿porque el primer respondedor no se ha establecido?). Sin embargo, es posible enviar el mensaje directamente, así:

// Focus TextField 
[textField becomeFirstResponder]; 

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

Eso no parece indicar cómo puedo habilitar la corrección de ortografía "como-usted" como puedo desde el menú Edición. Me estoy perdiendo algo aquí? – Luke

+0

Ver respuesta actualizada – pheelicks

+0

Bueno, el NSTextView no es compatible con la propiedad Focus Ring que no quería volver a inventar para esta situación. Realmente no entiendo por qué no puedo cambiar las opciones de ortografía a las que puedo acceder en el menú Edición> Ortografía y gramática al usar NSTextField. ¿No debería haber alguna forma de activar esa opción a través del código Obj-C? – Luke

1

¿Ha intentado aprovechar el método delegado textDidChange NSTextField: y llamadas:

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

cada vez?

+0

Me refiero a NSTextField no a UITextField. Esta es una pregunta de escritorio de Mac OS X. – Luke

+0

Esperaba que hubiera algo mejor que usar textDidChange. Observé que la barra de menú predeterminada está conectada a toggleAutomaticSpellingCorrection: en la opción Editar> Ortografía y gramática> Verificar ortografía al escribir. Esta opción de menú funciona con NSTextField una vez que se ejecuta la aplicación. Me gustaría saber cómo habilitar esa opción oficial, pensó el código Obj-C. – Luke

+0

Es posible que desee eliminar la sugerencia incorrecta de iPhone de su respuesta para que no aparezca en Google. – Luke