我有UITextView
配置了委托。我已通过将allowsEditingTextAttributes
设置为YES
来启用编辑属性。
当用户在文本视图中键入字符时,代理会收到textViewDidChange
:消息。
但是当用户更改属性(例如进行选择并点击粗体或斜体)时,不会发出textViewDidChange
:消息。
文档明确指出textViewDidChange
:应在用户更改属性时收到消息:
告诉委托者用户更改了指定文本视图中的文本或属性。
但它不适合我。我在这里缺少什么?
答案 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让我明白了这一点。