لماذا - [NSTextStorage replaceCharactersInRange: withAttributedString:] أحيانا، وأحيانا لا تحترم الخطوط في مجموعات الأحرف الأخرى؟

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

  •  21-08-2019
  •  | 
  •  

سؤال

وأنا أحاول لتشخيص مشكلة في UKSyntaxColoredTextDocument 0.4 HTTP: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm حيث يختفي النص الذي يعيش في الواقع في خط مختلف عن الذي قمت بتحديده أثناء الكتابة. (يمكنك تحميل ومحاولة الخروج هذه الأداة بارد لرؤية هذه المشكلة لنفسك ...)

وهنا الخلفية: هذه هي بعض تركيب كود التلوين أن يعيد تلوين أثناء الكتابة. يعمل كبيرة، ولكن إذا قمت بإدخال بعض الأحرف التي ليست جزءا من الخط المحدد لذلك عرض النص (مثل موناكو، هلفتيكا) ... على سبيل المثال، حرف رمز أو أي شيء باللغة اليابانية، والذي يستخدم في الواقع الخطوط مثل ZapfDingbatsITC أو HiraKakuProN-W3 لعرضه، ثم لا يتم عرض تلك الأحرف أثناء الكتابة.

ودعونا نقول لديك بعض النصوص من هذا القبيل: fdsafd [☀] sfds ‡ [☀☀☀] [日本語] ...

إذا قمت بلصق ذلك في حقل النص، والتبديل بين جملة تلوين المنبثقة من هذا استدعاء oldRecolorRange:، مع هذا السطر:

[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];

وهنا، فإن الأمور تتصرف كما أتوقع. نص ASCII، والرموز، والنص الياباني كلها مرئية. قيمة [textView textStorage] يبدأ بها، وينتهي، شيء من هذا القبيل: <أنا> (هذا هو الناتج من جدب، انها لا تظهر الأحرف يونيكود، لا تقلق بشأن ذلك)

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[{
...

... حتى بعد تعيين قيمة جديدة لتكون

dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

وبعبارة أخرى، يتم الاحتفاظ الخطوط "الخارجية" اللازمة لعرض هذه السلسلة تلقائيا بطريقة أو بأخرى، حتى لو لم يتم تحديد الخطوط في سلسلة الاستبدال.

ولكن عندما كنت اكتب في حرف واحد في وقت واحد، مكالمة مختلفة من replaceCharactersInRange:withAttributedString: في نتائج طريقة recolorRange: في سلسلة عزا ذلك هو <م> فقط في خط القاعدة - لم خطوط حرف الأجانب وقد أضيفت بالنسبة لنا، وبالتالي فإن الأحرف خارج نطاق الخط الرئيسي غير مرئية على الإطلاق!

dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

وأي فكرة لماذا هذا الأسلوب من شأنه أن يعمل في اتجاه واحد في ظرف واحد وليس في بلد آخر؟ هل هناك نوع من التحول الذي أنا يمكن أن تمر لإعطاء NSTextStorage / NSAttributedString تلميحا أننا نريد النص إلى عرض الأحرف الأجنبية؟

هل كانت مفيدة؟

المحلول

وحاول [[textView textStorage] fixFontAttributeInRange: مجموعة]. بعد [[textView textStorage] replaceCharactersInRange: مجموعة withAttributedString: vString] في recolorRange:

وأعتقد أن المشكلة بتحرير تخزين النص مرة أخرى ردا على processEditing، التي هي بالفعل نهاية الذيل من تحرير. - [NSTextStorage processEditing] يستخدم fixFontAttributeInRange :، ولكن منذ كنت في محاولة لتعديل مرة أخرى، هناك خطأ ويتم إسقاط سلوك الإصلاح.

عند القيام بذلك للمستند بأكمله، هناك العادي beginEditing / endEditing / processEditing التسلسل الذي يسبب fixFontAttributeInRange: ليتم استدعاؤها بسعادة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top