2012-10-11 21 views
14

Uno dei miei progetti è un'applicazione di test in cui uno studente non dovrebbe essere in grado di cercare facilmente le parole mentre stanno digitando.come disattivare la funzionalità LookUp (Dictionary, Thesaurus, Wikipedia) all'interno di un NSTextView?

È relativamente semplice disattivare il controllo ortografico automatico in NSTextView tramite setContinuousSpellCheckingEnabled: e setAutomaticSpellingCorrectionEnabled:.

Ho appena scoperto che è molto banale per gli studenti per simply tap with three fingers upon any selected word in qualsiasi app e su pop una finestra utile contenente un dizionario, thesaurus e anche una voce di Wikipedia se la parola può essere trovata lì.

What Lookup functionality looks like

Questo è grande funzionalità per il 99% delle applicazioni MacOS, ma non è appropriato per il mio test app.

Ora, dopo un paio di mesi, Apple ha mi ha fornito una soluzione (non documentato e sottile) che lavora per 10,8 solo e posso eventualmente fornire nelle risposte in basso, ma io bisogno di di avere una soluzione che funziona anche per 10.7 (che è dove questa funzionalità è arrivata).

Ci sono tre possibili piani di attacco su questo problema, ma non sono sicuro come affrontare uno di questi tre:

1)

ho bisogno di bloccare questa funzionalità di ricerca accada in questo testo vista.

2)

ho già cercato di eliminare le preferenze del dizionario (se esistono, se l'utente non ha aperto Dictionary.app, non ci sono le preferenze) ei file dizionario cache (in "~/Library/Cache", ma questo non sembra migliorare la situazione.

3)

O c'è un modo per essere in grado di rilevare l'impostazione trackpad che dice "Usa Lookup quando si fa un tre tap dita"? Probabilmente è in qualche com.apple. *. Plist da qualche parte o rilevabile tramite "defaults" ma non sono sicuro di dove.

EDIT:

Solo un po 'di tempo a disposizione per risolvere questo problema e speriamo premio una taglia. Qui è l'approccio che stavo cercando con "defaults":

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

Ma io non sono sicuro al 100% questi sono i corretti gesti/parole chiave per digitare e anche dopo di loro digitando (e la verifica che erano. salvato correttamente tramite "defaults read com.apple.driver.AppleBluetoothMultitouch.trackpad"), viene visualizzata la finestra di ricerca del dizionario.

Ora questa è la unica cosa che funziona, ma funziona solo con MacOS 10.8 (che è dove questi metodi sono stati esposti/portati). Basta ignorare questi due metodi nella sottoclasse NSTextView:

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

risposta

4

Ho il sospetto che la consultazione dei dizionari è implementata in uno dei due modi, come un servizio o tramite il protocollo NSTextInputClient. Quindi, sostituirò -validRequestorForSendType:returnType: nella sottoclasse del testo per vedere se è invocato per un tocco a tre dita.Ad ogni modo, sembra che per la tua app tu voglia restituire NO per tutti i servizi. È inoltre necessario eseguire l'override di writeSelectionToPasteboard:types: per restituire NO.

Se ciò non avviene, provare a ignorare i metodi di NSTextInputClient per verificare se vengono chiamati. In particolare, i metodi -attributedString e -attributedSubstringForProposedRange:actualRange: sarebbero come la ricerca del dizionario sta ottenendo il testo. Far sì che entrambi restituiscano nil dovrebbe impedirne il corretto funzionamento. Intendiamoci, il protocollo NSTextInputClient è fondamentale per l'utilizzo dei metodi di input e l'accesso in modalità "press-and-hold" ai caratteri con accenti e segni diacritici, quindi è possibile interromperlo. Non so se riuscirai a distinguere tra le richieste da un normale metodo di input e il gesto di ricerca del dizionario.

Se tutto il resto fallisce, è possibile implement a custom text view anziché utilizzare NSTextView. Non è banale, ma avrai il pieno controllo del suo comportamento.

+0

Override "' validRequestorForSendType: returnType: ' "non ha colpito punti di interruzione o NSLogs quando si fa un tocco a tre dita. Ma il paragrafo seguente - sovrascrivendo "' attributeSubstringForProposedRange: '" e "' attributeString' "colpiscono entrambi quando fanno una ricerca TFT. Se la prima chiamata fallisce, allora "' attributeString' "è il metodo di fallback che viene chiamato. Restituendo NULL per entrambi i risultati in un "' NSInternalInconsistencyException' "generato da" 'LUTSMDocumentTextAccessor'", ma l'app continua senza arresti anomali o comportamenti indesiderati successivi. Questo sembra * molto * promettente, Ken. Mi chiedo quale sia il rovescio della medaglia? –

+0

Gli unici svantaggi che posso pensare sono A) c'è un'eccezione generata e di solito quando vengono lanciate le eccezioni, c'è un crash successivo ... a meno che qualcosa non lo catturi. Forse c'è un posto nell'architettura della ricerca che lo sta catturando? B) Ho testato tutto il testo e le capacità di formattazione limitate che ho messo a disposizione degli utenti della mia app e non sono riuscito a vedere i due metodi "' attributeString' "richiamati per nulla oltre alla ricerca di tre dita toccate. Spero di non disabilitare per errore qualcosa nell'app restituendo NULL da questi due metodi. –

+1

È l'eccezione dal tuo processo? I metodi in questione hanno a che fare con i metodi di input, che in realtà vengono eseguiti in un processo separato. Puoi provare a sovrascrivere alcuni degli altri metodi 'NSTextInputClient' per vedere se riesci a convincere l'IM di ricerca dizionario a non aspettarti nemmeno che possa ottenere una stringa. Un altro pensiero, è possibile sovrascrivere '- [NSView inputContext]' per restituire 'nil' per disabilitare completamente i messaggi istantanei. Per quanto riguarda i lati negativi, hai provato IMs asiatici? Hai provato a premere e tenere premuto l'inserimento di caratteri accentati? IM come quelli sono quelli che mi aspetterei possano rompere. –

0

Questa risposta ad una domanda simile risolve il problema senza generare eccezioni con il trade off che utilizzano un API privato: https://stackoverflow.com/a/20618984/959140

semplicemente ridefinisce -(void)quickLookWithEvent:(NSEvent *)event nella sottoclasse e non fare nulla con l'evento.

+1

'- (void) quickLookWithEvent: (NSEvent *) event' è un'API pubblica a partire da OSX 10.8. –

0

Quando viene visualizzata la schermata del dizionario, andare su File (o forse è stato modificato)/Preferenze e deselezionare tutte le opzioni in modo che non vengano selezionate le opzioni del dizionario e chiudere l'app e non si visualizzi più - per la maggior parte - una volta ogni tanto mentre si cerca di usare il mousepad per selezionare una stringa di testo per copiare e/o tagliare, appare, ma non costantemente come prima ...