首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTextStorage语法降价

NSTextStorage语法降价
EN

Stack Overflow用户
提问于 2016-02-20 19:12:25
回答 1查看 592关注 0票数 2

我正在为iOS/osx编写一个语法标记。

它是NSTextStorage的一个子类。它在iOS中工作得很好,但在OSX中(在转换代码后,将UIColor转换为NSColor,将UIFont转换为NSFont),它确实工作得很好。这只是在OSX中发生的,因为在IOS中它工作得很好。

有什么帮助吗?

代码语言:javascript
复制
- (NSString *)string {
    return [_backingStore string];
}

- (NSDictionary *)attributesAtIndex:(NSUInteger)location effectiveRange:(NSRangePointer)range {
    return [_backingStore attributesAtIndex:location effectiveRange:range];
}

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString*)str {

    [self beginEditing];
    [_backingStore replaceCharactersInRange:range withString:str];
    [self edited:NSTextStorageEditedCharacters | NSTextStorageEditedAttributes range:range changeInLength:str.length - range.length];
    [self endEditing];

}

- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range {

    [self beginEditing];
    [_backingStore setAttributes:attrs range:range];
    [self edited:NSTextStorageEditedAttributes range:range changeInLength:0];
    [self endEditing];

}

- (void)processEditing {

    [self performReplacementsForRange:[self editedRange]];
    [super processEditing];
}

- (void)performReplacementsForRange:(NSRange)changedRange {

    NSString* backingString = [_backingStore string];
    NSRange extendedRange = extendedRange = NSUnionRange(changedRange, [backingString lineRangeForRange:NSMakeRange(NSMaxRange(changedRange), 0)]);
    [self applyStylesToRange:extendedRange];
}

- (void)applyStylesToRange:(NSRange)searchRange {

    NSDictionary* attributeDictionary = self.attributeDictionary;
    NSString* backingString = [_backingStore string];
    NSDictionary* bodyAttributes  = self.bodyAttributes;
    [self setAttributes:bodyAttributes range:searchRange];
    [attributeDictionary enumerateKeysAndObjectsUsingBlock:^(NSRegularExpression* regex, NSDictionary* attributes, BOOL* stop) {
        [regex enumerateMatchesInString:backingString options:0 range:searchRange
                             usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop) {
                                 NSRange matchRange = [match rangeAtIndex:1];
                                 [self addAttributes:attributes range:matchRange];
                             }];
    }];

}
EN

回答 1

Stack Overflow用户

发布于 2016-02-22 00:05:02

我不熟悉NSTextStorage,但是我通过重写fixAttributesInRange:而不是processEditing来解决这个问题。

而不是

代码语言:javascript
复制
- (void)processEditing {

    [self performReplacementsForRange:[self editedRange]];
    [super processEditing];
}

代码语言:javascript
复制
- (void)fixAttributesInRange:(NSRange)range {
    [self performReplacementsForRange:range];
    [super fixAttributesInRange:(NSRange)range];
}

顺便说一句:applyStylesToRange不应该嵌套在beginEditingendEditing之间吗

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35522394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档