12.3.3 UITextFieldDelegate
UITextField提供了一个UITextFieldDelegate协议,开发者可以为UITextField的delegate属性设置一个满足这个协议的实例。下面是这个协议声明的方法,在UITextField产生变化时被调用。
1.func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool
询问委托实例是否应在指定的UITextField中开始编辑,需要返回一个布尔值。当用户开始编辑文本时,通常会调用这个方法。如果要限制用户的编辑行为,可以使用这个方法来实现。如果确定不让用户再次编辑,则在这个方法中返回false。如果开发者在委托的实例类型中没有实现这个方法,那么默认状态就像这个方法返回了true一样。
2.func textFieldDidBeginEditing(_ textField: UITextField)
告诉委托实例指定的UITextField已经开始编辑。此方法一般会在指定的UITextField刚刚成为第一响应者时通知委托实例。使用此方法可以更新一些状态信息或执行其他任务,例如开发者可以使用此方法显示仅在编辑时才可见的额外视图。
3.func textFieldShouldEndEditing(_ textField: UITextField) -> Bool
询问委托实例是否应在指定的UITextField中停止编辑,需要返回一个布尔值。当指定的UIText Field被要求放弃第一响应者状态时,委托实例会被调用此方法。当用户选择使用另一个控件或开发者调用UITextField的resignFirstResponder方法时,可能会发生这种情况。但是,在焦点更改发生之前,委托实例会被调用此方法,这使得开发者有机会阻止更改发生。通常情况下,开发者将返回true,允许UITextField放弃第一响应者状态;但如果开发者发现委托实例在UITextField中检测到无效内容,则可能返回false。返回false会阻止用户切换到另一个控件,直到UITextField中的输入是有效的。开发者要注意,此方法只是询问委托实例有关编辑是否应停止,即使在委托实例中返回false,UIKit仍可能强制结束编辑。例如,UITextField从父视图或窗口中移除时,会自动放弃第一响应者状态。
4.func textFieldDidEndEditing(_ textField: UITextField)
告知委托实例指定的UITextField已经停止编辑。在UITextField放弃第一响应者状态后,会调用此方法。开发者可以使用此方法更新委托实例的状态信息,例如开发者可以使用此方法隐藏仅在编辑时可见的额外视图。委托实例实现此方法是可选的,如果委托实例也实现了textFieldDidEndEditing(_:reason:)方法,则UIKit会优先调用该方法。但是这个方法只在iOS 10.0版本之后才能使用,下面就是此方法的介绍。
5.func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEnd EditingReason)
调用时机与上面的方法一致。这里新增了一个reason参数,表明编辑结束的原因。使用此参数可以确定是合并文本的修改还是丢弃。如果在iOS 10.0之后的机型上面,这个方法会比上面的方法优先调用。
6.func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
询问委托实例是否更改指定的范围内的文本,需要返回一个布尔值。这里有另外两个参数:range是要替换的字符串范围,string是指定范围需要替换的字符串。在输入期间,string通常仅包含键入的单个新字符,但如果用户粘贴文本,则可能包含更多字符。当用户删除一个或多个字符时,替换字符串为空。如果可以替换指定范围内的文本,则返回true;如果返回false则保留旧文本。只要用户操作导致文本发生更改,委托实例就会被调用此方法。使用此方法可以验证用户输入的文本,例如开发者只想让用户输入数字,则可以使用此方法来防止除数值之外的内容被输入到UITextField中。
7.func textFieldShouldClear(_ textField: UITextField) -> Bool
询问委托实例是否可以删除UITextField的当前内容,需要返回一个布尔值。如果可以清除UITextField的内容,则返回true,否则返回false。UITextField调用此方法以响应用户按下内置的清除按钮(默认情况下不显示此按钮,但可以通过更改UITextField的clearButtonMode属性中的值来启用此按钮)。如果UITextField的clearsOnBeginEditing属性设置为true,编辑开始时也会调用此方法。如果委托实例未实现此方法,则UITextField将清除文本,就像这个方法返回true一样。
8.func textFieldShouldReturn(_ textField: UITextField) -> Bool
询问委托实例是否处理在UITextField按下的Return按钮,需要返回一个布尔值。只要用户点击“Return”按钮,委托实例就会被调用此方法。点击按钮时,开发者可以使用此方法实现任何自定义的操作,例如需要在用户点击返回按钮时关闭键盘,则可以在此方法中调用resignFirstResponder方法。如果需要UITextField执行其返回按钮的默认行为,则返回true,否则返回false。
开发者可以在实践项目的View Controller中将所有的UITextFieldDelegate方法实现一遍,在运行模拟器之后与UITextField进行交互来真实地体验每一个协议方法的回调时机。