iOS学习笔记(四):UITextField

相比于UILabel和UIButton控件,UITextField要复杂得多。UITextField是iOS系统中进行文本输入操作的UI控件,用户通过键盘将输入操作传递给UITextField,UITextField控件采用一些代理方法再将用户的一些操作行为回调给开发者,最后由开发者进行逻辑处理。

一、创建一个输入框

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //定义一个textField
        let textField = UITextField(frame: CGRect(x: 20, y: 100, width: 280, height: 30))
        //设置界面风格
        textField.borderStyle = .roundedRect
        //设置提示文字
        textField.placeholder = "请输入文字"
        self.view.addSubview(textField)
    }
    
}

运行结果如下:

上面的代码创建了一个输入框,UITextField的placeholder属性用于设置提示文字,这些文字在输入框中有输入时会自动隐藏,在输入框输入内容为空时才会显示。其作用主要是提示用户此输入框的作用,比如登录界面的用户名输入框通常会提示:“请输入用户名”。

UITextField的borderStyle属性用于设置输入框的界面风格,UITextBorderStyle枚举值的意义如下:

public enum UITextBorderStyle : Int {
    case none //无风格
    case line //线性风格
    case bezel //bezel风格
    case roundedRect //边框风格
}

二、UITextField常用属性介绍

与UILabel类似,UITextField也有相关属性用于输入框中文字属性的设置,代码示例如下:

//字体颜色
textField.textColor = UIColor.red
//字体样式、字号
textField.font = UIFont.systemFont(ofSize: 14)
//文字对齐方式
textField.textAlignment = .center

我们除了对输入框中文字属性进行设置外,UITextField还支持自定义左视图和右视图。左右视图的应用非常广泛,例如很多密码输入框左边都会有个小钥匙的图片,来提示用户输入框作用。设置左视图的代码示例如下:

let imageView = UIImageView(image: UIImage(named: "image"))
textField.leftView = imageView
textField.leftViewMode = .always

运行结果如图所示:

UITextField的leftView属性需要传入一个UIView或其子类的对象,上面的例子采用了UIImageView(图片显示控件),leftViewMode属性设置了显示左视图的显示模式,枚举意义如下:

public enum UITextFieldViewMode : Int {
    case never //从不显示
    case whileEditing //编辑时显示
    case unlessEditing //非编辑时显示
    case always //总是显示
}

三、UITextField的代理方法

说完了一些基本的使用方法,下面我们来谈谈UITextField的代理方法。UITextField的一些回调是通过代理方法实现的。例如,很多网站的会员账号采用手机号注册,这对于用户名输入框来说,只能允许用户输入不超过11位数字,若用户输入非数字字符或输入超限,应用会进行处理,使得用户输入无效并让用户重新输入。其实这个过程就是一个代理回调处理逻辑的过程,首先用户输入一个字符,字符被传进UITextField中,UITextField本身无法判断用户输入字符的有效性,它将字符通过代理方法再传递给开发者,由开发者进行逻辑处理。UITextFieldDelegate中支持以下代理方法:

    //输入框将要进入编辑模式时系统自动回调的方法
    public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        
    }
    //输入框已经进入编辑模式时系统自动回调的方法
    public func textFieldDidBeginEditing(_ textField: UITextField) {
        
    }
    //输入框将要结束编辑模式时系统自动回调的方法
    public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        
    }
    //输入框已经结束编辑模式时系统自动回调的方法
    public func textFieldDidEndEditing(_ textField: UITextField) {
        
    }
    //输入框中内容将要改变时系统自动回调的方法
    public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        
    }
    //输入框中内容将要清除时系统自动回调的方法
    public func textFieldShouldClear(_ textField: UITextField) -> Bool {
        
    }
    //用户按下return键后系统自动回调的方法
    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        
    }

 textFieldShouldBeginEditing方法是当用户在屏幕上单击输入框,键盘将要弹出来时会调用。这个函数有一个Bool类型的返回值,若开发者在实现这个函数时返回false,键盘就不会弹出来,UITextField控件也不能进入编辑状态。textFieldShouldEndEditing与textFieldShouldBeginEditing类似,只是它对应结束编辑的状态。textFieldDidBeginEditing和textFieldDidEndEditing分别是在UITextField已经开始和已经结束编辑状态时触发的方法。shouldChangeCharactersIn range: NSRange, replacementString方法在输入框中内容将要改变时会调用,这时会传进两个参数给开发者使用,range是将要改变的字符范围,string是将要替换成的字符串。同时这个函数还需要返回一个Bool类型的返回值,若返回false,这次字符改变的行为就不成功。因此,判断用户的输入是否合法的操作一般会放在这个代理方法中进行。textFieldShouldClear方法在单击清除按钮后会被调用,这里的返回值如果返回false,这次清除操作就会无效。textFieldShouldReturn方法在用户按键盘上的return键后进行调用。

四、实战:实现一个监听用户输入信息的输入框

下面我们运用代理方法实现一个监听用户输入11位手机号信息的输入框,来增强对代理方法的认识。

运用代理方法需要以下3步:

(1)遵守相关协议
(2)设置代理
(3)实现代理方法

首先,在类的声明部分添加要遵守的代理,如下所示:

class ViewController: UIViewController,UITextFieldDelegate

随后,在viewDidLoad方法中添加如下一行代码进行代理的设置:

textField.delegate = self

在ViewController类中实现如下代理方法

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if string.count>0{
            let charas:[Character] = ["0","1","2","3","4","5","6","7","8","9"]
            let char = string.first!
            if !charas.contains(char){
                print("请输入数字")
                return false
            }
            if textField.text!.count+string.count>11{
                print("您输入的手机号超过11位")
                return false
            }
        }
        return true
    }

上述方法中,先进行了是否是数字的逻辑判断。若不是数字,就会打印提示信息,并且使得本次输入无效;之后判断数字是否超过11位,这个判断的条件是:如果输入框中原有文字的长度加上本次输入字符的长度超过11位,就打印提示信息并使得本次输入无效。这样,一个只能输入数字且不可超过11位的输入框就完成了,运行结果如下图所示:

发表评论

电子邮件地址不会被公开。 必填项已用*标注