6

我有一个UITextView被解析的,并且在输入某些字符时它的属性发生了变化。文本没有改变,只有描述文本格式的属性。

如果我解析每个字符条目,我实际上是在抓取text,创建具有正确格式的属性字符串,并将attributedTexttextview 的属性设置为我的新属性字符串。这完全破坏了自动更正、双空格快捷方式和拼写检查。

如果我只在输入某些特殊字符时进行解析,这会更好一些,但我会遇到奇怪的错误,比如每个句子的第二个单词都是大写的。

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

我的问题是:有没有办法改变我的文本视图的文本属性而不重置文本视图的attributedText属性并破坏所有这些方便的功能UITextView

4

2 回答 2

2

详细说明fatuhoku上面的评论。你可以打电话

func setAttributes(_ attrs: [NSAttributedString.Key: Any]?, range: NSRange)

在文本视图的.textStorage.

于 2020-12-16T18:00:26.893 回答
0

我遇到了同样的问题,结果发现UITextView 的属性属性设置触发了textViewDidChange:方法。因此,从textViewDidChange:方法内部设置属性文本属性创建了一个无限循环。

我做了一个快速修复,每隔一次调用该方法时,我会立即从textViewDidChange:方法返回。它似乎工作正常,但我仍然需要检查更多。

于 2013-05-14T11:31:08.990 回答