关于如何格式化/着色NSTextView的字符串的技巧

bru*_*lla 7 cocoa string-formatting nstextview nsattributedstring

我正在寻找一种可靠的技术来在NSTextView中进行简单的字符串格式化(粗体,斜体,...).文本解析几乎是用正则表达式完成的,但现在我需要应用字体特征并改变大小.

关于如何使文本变粗的一些代码片段

[[textView textStorage] beginEditing];
[[textView textStorage] applyFontTraits:NSFontBoldTrait range:range];
[[textView textStorage] endEditing];
Run Code Online (Sandbox Code Playgroud)

这和尺寸也随之改变

[[textView textStorage] beginEditing];  
NSFont* font = [[textView textStorage] attribute:NSFontAttributeName atIndex:range.location effectiveRange:nil];

NSFont* newFont = [NSFont fontWithName:[font familyName] 
                                  size:[font pointSize] + size];

[[textView textStorage] addAttribute:NSFontAttributeName 
                               value:newFont 
                               range:range];
[[textView textStorage] endEditing];
Run Code Online (Sandbox Code Playgroud)

工作良好.我现在唯一的问题是,在某些情况下,当我键入新字符时,默认情况下这些字符是粗体或斜体,即使我没有将属性应用于它们.

我是否需要重置与东西setTypingAttributesNSTextView还是我只是错过了一些东西?

feb*_*ing 2

我认为你的 set 方法是正确的typingAttributes参考-setTypingAttributes:

但是,如果您添加任何更改文本属性的用户操作,则该操作应使用此方法来应用这些属性。更改属性的用户操作应始终设置键入属性,因为在下次键入之前可能不会发生后续的选择更改。

这似乎适用于你的情况。

我不知道所描述的行为是否仅适用于 TextEdit 等所见即所得编辑器。您似乎正在处理一些行为与具有语法突出显示的编辑器类似的东西。在那里,您永远不想手动更改文本属性,而是更改语法的结构。它可能不适合这种情况,您应该typingAttributes根据解析到那里来重置或设置它。