当UITextView文本发生变化时,解析并创建NSAttributedString

时间:2012-08-11 09:37:22

标签: objective-c cocoa uitextview nsattributedstring control-flow

当用户键入UITextView或调用setText:方法时,我正在尝试解析字符串的某些部分,然后将NSAttributedString设置回文本视图。但是在我当前的实现中,这会导致无限的递归循环。由于设置新的属性文本会导致文本发生更改(以及触发通知),然后我会重新解析文本。

有人建议我使用某种标志,所以当我解析和设置文本时,我不会继续这样做。虽然这似乎不是最佳解决方案。这是我的代码片段......

CustomTextView.h(UITextView子类)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewDidChange:) name:NSTextViewTextDidChangeNotification object:self];

CustomTextView textViewDidChange:

- (void)textViewDidChange:(NSNotification *)notification;
{
    __block NSString *string = self.text;

    dispatch_async(parserQueue, ^{
        NSAttributedString *parsedString = [self parseAttributesForString:string];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self setAttributedText:parsedString];
        });
    });
}

CustomTextView setText:

- (void)setText:(NSString *)text
{
    [super setText:text];
    [self textViewDidChange:nil];
}

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,首先我要在属性文本中添加一个观察者,而不是对类进行子类化并发布通知。接下来,我只是检查文本对象是什么类。我打电话给[text isKindOfClass:[NSString class]]。通过调用它,您可以知道对象是否需要再次解析。