2

iOS/osx の構文マークダウンを書いています。

NSTextStorage のサブクラスです。iOSではうまく機能しますが、OSXでは(コードを変換した後、UIColorをNSColorに、UIFontをNSFontに)非常にうまく機能します。現在の行の最後に書くとうまくいきますが、キャレットの位置をテキストの中央に変更すると、1文字を入力した直後にキャレットの位置が行末に変わります。これは OSX でのみ発生します。これは、IOS ではうまく機能するためです。

問題があること- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)rangeはわかっていますが、修正方法がわかりません...何か助けはありますか?

- (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];
                             }];
    }];

}
4

1 に答える 1

0

私は NSTextStorage に慣れていませんが、fixAttributesInRange:代わりにオーバーライドすることでこれを修正できましたprocessEditing

それ以外の

- (void)processEditing {

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

行う

- (void)fixAttributesInRange:(NSRange)range {
    [self performReplacementsForRange:range];
    [super fixAttributesInRange:(NSRange)range];
}

ところで: と の間に入れ子にしないでapplyStylesToRangeください?beginEditingendEditing

于 2016-02-21T16:05:01.583 に答える