Perché - [NSTextStorage replaceCharactersInRange: withAttributedString:] a volte, a volte non onora i font in altri set di caratteri?
-
21-08-2019 - |
Domanda
Sto cercando di diagnosticare un problema in UKSyntaxColoredTextDocument 0.4 http: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm in cui il testo che in realtà vive in un tipo di carattere diverso da quello che hai specificato scompare durante la digitazione. (È possibile scaricare e provare questo programma di utilità bello vedere questo problema per voi stessi ...)
Ecco lo sfondo: Questo è un codice che la colorazione della sintassi ricolora durante la digitazione. E le grandi opere, ma se si immettono alcuni caratteri che non fanno parte del carattere impostato per quella vista testo (ad esempio Monaco, Helvetica) ... per esempio, un personaggio simbolo o qualcosa in giapponese, che utilizza in realtà fonts come ZapfDingbatsITC o HiraKakuProN-W3 per visualizzarlo, quindi quei personaggi non vengono visualizzati durante la digitazione.
Diciamo che hai un po 'di testo come questo: fdsafd [☀] sfds ‡ [☀☀☀] [日本語] ...
Se si incolla che nel campo di testo, e di passare da uno la colorazione della sintassi dal popup, questo invoca oldRecolorRange:
, con questa linea:
[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];
Qui, le cose si comportano come mi sarei aspettato. Il testo ASCII, i simboli, e il testo giapponese sono tutti visibili. Il valore di [textView textStorage] inizia e finisce, qualcosa di simile: (. Questo è uscita di gdb, non sta mostrando i caratteri Unicode, non preoccupatevi di quello)
df{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }?{ NSFont = "ZapfDingbatsITC 20.00 pt. P [] (0x001ae720) fobj=0x001bb370, spc=5.56"; }fdsafd[{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }?{ NSFont = "HiraKakuProN-W3 20.00 pt. P [] (0x001b59e0) fobj=0x001bb600, spc=6.66"; }]sfds[{ ...
... anche dopo aver impostato il nuovo valore di essere
dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }
In altre parole, i caratteri "stranieri" necessari per visualizzare questa stringa sono conservati automaticamente in qualche modo, anche se i font non sono specificate nella stringa di sostituzione.
Tuttavia, quando si digita un carattere alla volta, una chiamata diversa replaceCharactersInRange:withAttributedString:
nel metodo recolorRange:
risultati in una stringa attribuito che è solo nel font di base - senza sono stati aggiunti i caratteri stranieri caratteri per noi, così i personaggi fuori della gamma del carattere principale non sono visibili a tutti!
dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }
Qualsiasi idea del perché questo metodo avrebbe lavorato in un modo in una circostanza e non in un altro? C'è una sorta di interruttore che posso passare a dare il NSTextStorage
/ NSAttributedString
un suggerimento che vogliamo che il testo da visualizzare i caratteri stranieri?
Soluzione
Prova [fixFontAttributeInRange [textView textStorage]: gamma]; dopo che il [[textView textStorage] replaceCharactersInRange: gamma withAttributedString: vString] in recolorRange:
Credo che il problema sta modificando nuovamente la memorizzazione del testo in risposta a processEditing, che è già la coda di una modifica. - [NSTextStorage processEditing] utilizza fixFontAttributeInRange :, ma dal momento che si sta cercando di modificare di nuovo, qualcosa sta andando storto e il comportamento correzione è che è caduto.
Quando lo si fa per l'intero documento, v'è una normale sequenza / endEditing / processEditing beginEditing che provoca fixFontAttributeInRange:. Per essere chiamato felicemente