2012-10-11 18 views
14

Uno de mis proyectos es una aplicación de prueba en la que un alumno no debería poder buscar fácilmente las palabras mientras escribe.cómo deshabilitar la funcionalidad LookUp (Dictionary, Thesaurus, Wikipedia) dentro de un NSTextView?

Es relativamente fácil desactivar la verificación ortográfica automática en un NSTextView a través de setContinuousSpellCheckingEnabled: y setAutomaticSpellingCorrectionEnabled:.

Acabo de descubrir que es muy trivial para los estudiantes simply tap with three fingers upon any selected word en cualquier aplicación y hasta aparece una ventana útil que contiene un diccionario, tesauro e incluso una entrada de Wikipedia si la palabra se puede encontrar allí.

What Lookup functionality looks like

Ésta es una gran funcionalidad para el 99% de las aplicaciones de MacOS, pero no es apropiado para mi aplicación de prueba.

Ahora, después de unos meses, Apple me ha proporcionado una solución (no documentada y sutil) que trabaja el 10,8 única y puede que finalmente proporcionarlo en las respuestas abajo, pero necesita tener una solución que funciona para 10.7 también (que es donde entró esta funcionalidad).

Hay tres posibles planes de ataque contra este problema, pero no estoy seguro de cómo acercarse a cualquiera de estos tres:

1)

necesito para bloquear esta funcionalidad de búsqueda suceda en este texto ver.

2)

ya he intentado eliminar las preferencias del diccionario (si es que existen, y si el usuario nunca se abrió Dictionary.app, no hay preferencias) y los archivos de caché (en el diccionario "~/Library/Cache", pero esto no parece mejorar la situación.

3)

O hay una manera de ser capaz de detectar la configuración del trackpad que dice "uso de búsqueda cuando se hace un grifo de tres dedos"? Es probable que esté en algún punto de com.apple * en algún lugar o detectable a través de "defaults", pero no estoy seguro de dónde.

EDIT:

Sólo un poco de tiempo para resolver este problema es de esperar y adjudicar una recompensa. Aquí es el enfoque que yo estaba tratando con "defaults":

defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerTapGesture -bool false 
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDoubleTapGesture -bool false 

, pero no estoy 100% seguro de que estos son los gestos correctos/palabras clave para escribir y aún después de escribir en ellos (y verificar que eran. guardado correctamente a través de "defaults read com.apple.driver.AppleBluetoothMultitouch.trackpad"), la ventana de búsqueda del diccionario aún aparece.

Ahora aquí está el único que funciona, pero funciona solo bajo MacOS 10.8 (que es donde se expusieron/introdujeron estos métodos). Simplemente anular estos dos métodos en la subclase NSTextView:

- (void)quickLookWithEvent:(NSEvent *)event; 
- (void)quickLookPreviewItems:(id)sender; 

Respuesta

4

sospecho que la búsqueda de diccionario se lleva a cabo en una de dos maneras, como un servicio o a través del protocolo NSTextInputClient. Entonces, anularía -validRequestorForSendType:returnType: en su subclase de texto para ver si se invoca con un toque de tres dedos.De todos modos, parece que para su aplicación desea devolver NO para todos los servicios. También debe anular writeSelectionToPasteboard:types: para devolver NO.

Si eso no funciona, intente anular los métodos de NSTextInputClient para ver si se están llamando. En particular, los métodos -attributedString y -attributedSubstringForProposedRange:actualRange: serían la forma en que la búsqueda del diccionario está obteniendo el texto. Hacer que los dos regresen nil debe evitar que funcione. Tenga en cuenta que el protocolo NSTextInputClient es fundamental para el uso de métodos de entrada y para mantener el acceso a los caracteres con acentos y signos diacríticos, así que puede romper eso. No sé si podrá distinguir entre las solicitudes de un método de entrada normal frente al gesto de búsqueda del diccionario.

Si todo lo demás falla, puede implement a custom text view en lugar de usar NSTextView. No es trivial, pero tendrás un control total sobre su comportamiento.

+0

Reemplazando "' validRequestorForSendType: returnType: ' "no tocó puntos de interrupción o NSLogs al hacer un toque de tres dedos. Pero el siguiente párrafo - reemplazando "' attributeSubstringForProposedRange: '" & "' attribuString' "ambos golpean al hacer una búsqueda TFT. Si la primera llamada falla, entonces "' attributedString' "es el método alternativo al que se llama. Devuelve NULL para ambos resultados en una "' NSInternalInconsistencyException' "lanzada desde" 'LUTSMDocumentTextAccessAccessor'", pero la aplicación continúa sin fallas o con un comportamiento incorrecto posterior. Esto parece * muy * prometedor, Ken. Me pregunto cuál es el inconveniente? –

+0

Las únicas desventajas que puedo pensar son: A) hay una excepción que se lanza y, generalmente, cuando se lanzan excepciones, se produce un bloqueo posterior ... a menos que algo lo atrape. Tal vez haya algún lugar en la arquitectura de búsqueda que lo esté captando. B) Probé todo el texto y la capacidad de formato limitada que pongo a disposición de los usuarios de mi aplicación, y no pude ver los dos métodos de '' attributed String' llamados para nada aparte de la búsqueda con tres dedos. Espero que no esté desactivando accidentalmente algo en la aplicación devolviendo NULL de esos dos métodos. –

+1

¿Es la excepción de su proceso? Los métodos en cuestión tienen que ver con los métodos de entrada, que en realidad se ejecutan en un proceso separado. Puede intentar anular algunos de los otros métodos 'NSTextInputClient' para ver si puede convencer a la mensajería instantánea de búsqueda del diccionario de que ni siquiera espera que pueda obtener una cadena. Otro pensamiento, puede anular '- [NSView inputContext]' para devolver 'nil' para deshabilitar IMs por completo. En cuanto a las desventajas, ¿has probado los mensajes instantáneos asiáticos? ¿Has intentado presionar y mantener la entrada de caracteres acentuados? Los mensajes instantáneos como esos son lo que esperaría que se rompieran. –

0

Esta respuesta a una pregunta similar soluciona el problema sin lanzar excepciones con la compensación que utiliza una API privada: https://stackoverflow.com/a/20618984/959140

simplemente anulan -(void)quickLookWithEvent:(NSEvent *)event en la subclase y no hacen nada con el evento.

+1

'- (void) quickLookWithEvent: (NSEvent *) event' es una API pública a partir de OSX 10.8. –

0

Cuando aparece la pantalla del diccionario, vaya a Archivo (o tal vez fue editar)/Preferencias y desmarque todas las opciones para que no se marquen las opciones reales del diccionario, cierre la aplicación y deje de mostrarse - para la mayor parte - de vez en cuando mientras se intenta usar el mousepad para seleccionar una cadena de texto para copiar y/o cortar, aparece, pero no constantemente como antes ...

Cuestiones relacionadas