Swift 踩坑笔记(三)—— UITextField 的坑

综述

设计四个问题

  • 如何从 UITextField 的回调中实时获取 text 文本
  • 如何限制文字的上限,比如登录时,手机号最多11位
    • 当前情况下,如何截取字符串
  • 在左侧/右侧添加图片的占位方法

如何从 UITextField 的回调中实时获取 text 文本

注:另一个 回调 shouldChangeCharacter 只能获取到输入成功之前的,比如我现在 text 中是12, 这时候键盘输入了一个3,或者输入了删除键,那么就进入到这个回调了,去读 text 也只能拿到12

UITextFieldDelegateswift 中取消了 textFieldDidChange这个OC 中的回调
需要自己实现textFieldDidChange, 这个回调是实时监听 text 内容的

textField.addTarget(SomeClass, action: Selector(("textFieldDidChange:")), for: .editingChanged)

//...
@objc func textFieldDidChange(_ textField: UITextField) {

}

截取字符串

可以看下这篇参考资料
swift 截取字符串的操作有很多,看起来也比较麻烦,这里直接借花献佛

extension String {
    func mySubString(to index: Int) -> String {
        return String(self[.. String {
        return String(self[self.index(self.startIndex, offsetBy: index)...])
    }
}

当然,如果不熟悉String的方法,也可以使用NSString. 在onevcatswift技巧中有提及到
(strInstance as NSString)之后,再通过点调用就可以拿到我们之前熟悉的NSString方法了


如何限制文字的上限,比如登录时,手机号最多11位

这里直接判断text的长度,在输入中文时会有坑,所以判读输入格式,然后判断是否存在被mark的text,在中文输入的过程中的字母就是被mark的,如果没有mark就判断长度,这样就能够实现我们想要的效果了

func imposeTextInputMaxLength(_ textField: UITextField, maxLength: Int) {
    guard let _ = textField.text else { return }
    
    debugPrint("\(textField.text!)")
    let lang = textField.textInputMode?.primaryLanguage
    let tmpText = textField.text!
    if lang == "zh-Hans" {
        let range = textField.markedTextRange
        if range == nil {
            guard tmpText.count >= maxLength else { return }
            textField.text = tmpText.mySubString(to: maxLength)
        }
    } else {
        guard tmpText.count >= maxLength else { return }
        textField.text = tmpText.mySubString(to: maxLength)
    }
}

在左侧/右侧添加图片的占位方法

这一点其实和 Swift无关了,因为OC本身也有这个功能
我们经常要实现一个登录之类的输入框,类似于下面这样:

image.png

要么我们自己去封装,要么直接使用UITextField的左右填充属性来实现

image.png

下面的代码实际上是去创建一个frame 布局的控件用来填充UITextField左侧的图像展示区,这时候布局和约束无关

let leftContainerView = UIView.init(frame: CGRect(x: 0, y: 0, width: normalLeftViewWidth, height: imageSize))
//普通图片
let leftImgView = UIImageView.init(frame: CGRect(x: 10, y: 0, width: 19, height: 19))
leftImgView.image = img
leftContainerView.addSubview(leftImgView)
textField.leftViewMode = .always
textField.leftView = leftContainerView

你可能感兴趣的:(Swift 踩坑笔记(三)—— UITextField 的坑)