在不重置attributedText属性的情况下更改UITextView上的属性

8
我有一个UITextView,当输入特定字符时,会解析并改变其属性。文本不会改变,只有描述文本格式的属性发生了改变。
如果每输入一个字符就进行解析,那么我基本上是获取text,使用正确的格式创建带属性的字符串,并将文本视图的attributedText属性设置为我的新的带属性字符串。这会完全破坏自动更正、双击空格键快捷方式和拼写检查功能。
如果仅在输入特定特殊字符时进行解析,则可以更好地解决此问题,但出现诸如每个句子的第二个单词首字母大写等奇怪的错误。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if (text.length == 0) {
        return YES;
    }
    unichar firstCharacterInText = [text characterAtIndex:0];
    if (/* special character */) {
        [self processTextView];
    }
}

- (void) processTextView {
    NSString *text = self.text;

    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:text];

    [attributedString addAttribute:NSFontAttributeName value:[UIFont fontWithName:kFontRegular size:12.0f] range:NSMakeRange(0, text.length)];
    [attributedString addAttribute:NSForegroundColorAttributeName value:[UIColor textColor] range:NSMakeRange(0, text.length)];
    // set other properties 
}

我的问题是:是否有一种方法可以更改文本视图的文本属性,而不需要重置textview的attributedText属性并破坏所有那些方便的UITextView特性?


仅供后人参考:当我在textViewDidChange/shouldChange中设置attributedText时,也遇到了自动更正中断的问题,当我意识到这不是一个错误时,我就要提交radar了。这种行为是由于每次输入新字符时文本视图完全更改其内容所导致的,因此自动更正、双空格快捷方式等都无法发挥作用。我没有看到解决这个问题的方法,除了探索CoreText。 - nathan
在iOS 7中,您可以使用TextKit来实现您想要的功能。 - fatuhoku
3个回答

5

在不重置attributedText(NSAttributedString)属性的情况下,突出显示UITextView中一定范围内的文本。

let range = NSRange(location: 100, length: 20)
let attribute = [NSAttributedString.Key.backgroundColor: UIColor.yellow]
textStorage.addAttributes(attribute, range: range)

textStorage is a property of UITextView.


仅有的 textStorage 帮了我,非常感谢。 - Saeed Rahmatolahi

4
为了进一步阐述fatuhoku上面的评论,您可以调用
func setAttributes(_ attrs: [NSAttributedString.Key: Any]?, range: NSRange)


在文本视图的 .textStorage 上。

1
很棒的提示。应该标记为答案。 - HiveHicks

0

我曾经遇到过同样的问题,结果发现设置UITextView的attributedText属性会触发textViewDidChange:方法。因此,在textViewDidChange:方法中设置attributedText属性会创建一个无限循环。

我进行了快速修复,每次调用该方法时,我会立即从textViewDidChange:方法返回另一次。看起来它运行良好,但我仍然需要进一步检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接