3

我有一个UITextView配置了一个代表。我已通过设置allowsEditingTextAttributes为启用编辑属性YES

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

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

该文档特别指出textViewDidChange:当用户更改属性时应该收到一条消息:

告诉代理指定文本视图中的文本或属性已被用户更改。

但这对我不起作用。我在这里想念什么?

4

4 回答 4

5

我在 iOS 6 中测试了这个场景并得到了完全相同的结果:“选择”弹出窗口中的属性更改没有触发该 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);
    }
}
于 2012-10-25T13:53:25.460 回答
3

文档中还提到了

This method is not called in response to programmatically initiated changes

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

于 2012-10-25T04:37:42.897 回答
2

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

yourTextView.delegate = self

这样您的文本视图将控制您当前的课程。

于 2012-10-25T04:34:47.517 回答
1

我通过继承 UITextView、覆盖toggleBoldface:toggleItalics:方法以及从这些方法toggleUnderline:调用来解决这个问题。这个答案帮助我弄清楚了。[self.delegate textViewDidChange:self]

于 2014-01-01T00:33:44.120 回答