2013-11-02 21 views
1

我一直在使用TextKitNSTextStorage對象UITextView嘗試獲取某些字以動態格式化。NSTextStorage addAttribute僅適用於指定範圍的字符

以下方法位於UITextView的子類中,並在textDidChange事件中執行。這樣做的效果在於,它確實能夠檢測何時輸入了「the」這個詞,並且它確實將它變成紅色,但是「the」之後的所有文字也是紅色的。目標僅僅是「the」是紅色的。

任何想法我做錯了什麼?

- (void)highlight { 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\bthe\\b" options:0 error:nil]; 
    NSArray *matches = [regex matchesInString:[self text] options:0 range:NSMakeRange(0, [self.text length])]; 
    for (NSTextCheckingResult *match in matches) { 
     [self.textStorage beginEditing]; 
     [self.textStorage addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:match.range]; 
     [self.textStorage endEditing]; 
    } 
} 
+0

'match.range'的值是否正確? –

+0

是的,範圍已被證實是正確的。 –

+0

嘗試將所有匹配項設置爲紅色後,將文本視圖的「typingAttributes」設置爲「正常」屬性(不管文本的屬性是否爲紅色)。 –

回答

0

這是發生,因爲NSTextStorage實際上是一個NSMutableAttributedString子類,NSMutableAttributedString作品是這樣的:它延伸屬性插入的文本。

嘗試子類化NSTextStorage(如此,您需要實施四種方法,如NSTextStorage文檔中所述)。然後,在您的NSTextStorage子類中實現-fixAttributesInRange:。您需要在此方法中管理文本屬性(例如,在您提供的示例中突出顯示單詞「the」)。

提高效率的一個訣竅就是儘可能少地重新處理文本。這樣做的一個方法是爲當前段落只處理文本發生了變化:

NSRange paragaphRange = [self.string paragraphRangeForRange:self.editedRange];

self.editedRange會被你的超正確填充是剛剛更改文本的範圍。