UITextView没有在属性更改时触发textViewDidChange?

时间:2012-10-25 02:52:18

标签: iphone uitextview

我有UITextView配置了委托。我已通过将allowsEditingTextAttributes设置为YES来启用编辑属性。

当用户在文本视图中键入字符时,代理会收到textViewDidChange:消息。

但是当用户更改属性(例如进行选择并点击粗体或斜体)时,不会发出textViewDidChange:消息。

文档明确指出textViewDidChange:应在用户更改属性时收到消息:

  

告诉委托者用户更改了指定文本视图中的文本或属性。

但它不适合我。我在这里缺少什么?

4 个答案:

答案 0 :(得分:5)

我在iOS 6中测试了这个场景并得到了完全相同的结果:来自“select”弹出窗口的属性更改未触发textViewDidChange:方法。似乎这是一个错误,或者文档需要澄清什么类型的属性更改会触发此事件。

可能的解决方法是实现textViewDidChangeSelection:方法。无论何时进行选择(在更改属性之前用户必须执行),都会调用它。检查selectedRange.length是否> 0(这意味着已选择实际单词,而不是仅仅移动光标),并保存selectedRange。一旦长度再次为零,则意味着他们取消选择该项目。那时,您可以使用前一个范围并使用文本。

- (void)textViewDidChangeSelection:(UITextView *)textView
{
    static BOOL rangeSet = NO;
    static NSRange mySelectedRange;
    if( textView.selectedRange.length > 0 && !rangeSet )
    {
        mySelectedRange = textView.selectedRange;
        rangeSet = YES;
    }
    else if( textView.selectedRange.length == 0 && rangeSet)
    {
        // Work with text
        NSLog(@"Working with previously select text: %d, %d", mySelectedRange.location, mySelectedRange.length);
    }
}

答案 1 :(得分:3)

请检查您是否在.h文件中设置了UITextViewDelegate。你也必须'make

yourTextView.delegate = self

这样您的文本视图就可以控制当前的类。

答案 2 :(得分:3)

documentation中,还提到了

This method is not called in response to programmatically initiated changes

因此,如果您以编程方式设置粗体或斜体,则不会调用此委托方法

答案 3 :(得分:1)

我通过继承UITextView,覆盖toggleBoldface:toggleItalics:toggleUnderline:方法,并从这些方法调用[self.delegate textViewDidChange:self]来解决这个问题。 This answer让我明白了这一点。