对于我的语法高亮实现,我观察NSTextView
使用-[<NSTextStorageDelegate> textStorageDidProcessEditing:]
的更改。
- (void)textStorageDidProcessEditing:(NSNotification *)notification {
if (!self.languageGrammar) return;
NSTextStorage *textStorage = self.textView.textStorage;
NSRange glyphRange = [self.textView.layoutManager glyphRangeForBoundingRect:self.scrollView.documentVisibleRect
inTextContainer:self.textView.textContainer];
NSRange editedRange = [self.textView.layoutManager characterRangeForGlyphRange:glyphRange actualGlyphRange:NULL];
[textStorage removeAttribute:NSForegroundColorAttributeName range:editedRange];
// crash is the line above ^^^^
// color text ...
}
我想获得可见字符的范围。上面的代码一直有效,直到我点击 backspace ,这使它崩溃:
*** -[NSConcreteTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds
我如何获得可见字符的范围,以便我可以为它们着色?
答案 0 :(得分:2)
检查范围是否超出整个字符串的范围,如果设置范围以适合字符串的范围:
NSRange range = NSRangeFromString(string);