12.14.3 UITextViewDelegate
UITextView提供了一个UITextViewDelegate协议,开发者可以为UITextView的delegate属性设置一个满足这个协议的实例。下面是这个协议声明的方法,在UITextView产生变化时被调用。
1.textViewShouldBeginEditing(_ textView: UITextView) -> Bool
询问委托实例是否可以开始编辑文本。在大多数情况下,开发者只需从此方法返回true即可继续编辑。因为此方法是可选的,如果它没有被实现,则编辑继续进行,就好像此方法返回true一样。
2.textViewDidBeginEditing(_ textView: UITextView)
告诉委托实例UITextView已经开始编辑,此方法的实现是可选的。在用户开始编辑文本视图之后以及在实际进行任何更改之前,UITextView会立即将此消息发送给其委托属性。开发者可以在此方法中设置任何与编辑相关的数据,并准备好接收可能到来的编辑消息。
3.textViewShouldEndEditing(_ textView: UITextView) -> Bool
询问委托属性是否可以结束文本编辑。当UITextView放弃第一响应者时会调用此方法,比如用户点击了其他的控件,转移了第一响应者,在转移之前这个方法将被调用,这样开发者就有机会决定是否要这么做。一般以返回true来同意转移第一响应者,但是如果UITextView的输入需要验证通过才能切换到其他控件,则可以通过返回false实现这样的效果。要注意的是,这个方法仅仅是提供是否可以结束文本编辑的选择,最终是否结束还会受到其他影响,比如视图被父视图移除或者强制转移第一响应者。如果不实现这个方法,那么第一响应者就会被转移,好像这个方法返回了true一样。
4.textViewDidEndEditing(_ textView: UITextView)
告知委托实例UITextView已完成编辑,此方法的实现是可选的。文本视图在暂停其编辑的内容并放弃第一个响应者状态后,会调用委托实例的这个方法。开发者可以使用此方法重置一些在文本视图开始编辑之前的状态信息。
5.textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool
询问委托实例是否应在文本视图中替换指定范围的文本。只要用户键入新字符或删除现有字符,文本视图就会调用委托实例的这个方法。此方法的实现是可选的,在文本提交到文本视图存储之前,可以使用此方法替换将要修改的文本。例如,拼写检查程序可能会使用此方法来检查输入的词语拼写是否正确并进行替换。
6.textViewDidChange(_ textView: UITextView)
告诉委托实例用户已经更改了指定文本视图中的文本或属性,此方法的实现是可选的。文本视图调用委托实例的这个方法以响应用户对文本的更改,如果文本的修改是来自程序而非用户的,这个方法将不被调用。
7.textViewDidChangeSelection(_ textView: UITextView)
告诉委托实例UITextView文字的选中范围发生了变化,此方法的实现是可选的。开发者使用文本视图的selectedRange属性来获取最新的选中范围。
8.textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
询问委托实例是否允许用户与UITextView中提供的文本附件进行交互,此方法的实现是可选的。如果用户点击或长按文本附件并且其image属性不为nil,则文本视图会调用委托的这个方法。除了显示与文本内联的文本附件之外,开发者还可以使用此方法触发其他操作。
9.textView(_ textView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool
询问委托实例是否允许用户在给定的文本范围内与给定的URL链接进行交互,此方法的实现是可选的。如果用户点击或长按URL链接,则文本视图会调用委托实例的这个方法。默认情况下,文本视图会打开负责处理这个类URL的应用程序并将URL传递给指定的应用。开发者可以使用此方法触发替代操作,例如在当前应用程序的Web视图中使用此URL链接来显示Web内容。