Perché - [NSTextStorage replaceCharactersInRange: withAttributedString:] a volte, a volte non onora i font in altri set di caratteri?

StackOverflow https://stackoverflow.com/questions/678620

  •  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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top