综述
设计四个问题
- 如何从
UITextField
的回调中实时获取text
文本 - 如何限制文字的上限,比如登录时,手机号最多11位
- 当前情况下,如何截取字符串
- 在左侧/右侧添加图片的占位方法
如何从 UITextField
的回调中实时获取 text
文本
注:另一个 回调
shouldChangeCharacter
只能获取到输入成功之前的,比如我现在 text 中是12, 这时候键盘输入了一个3,或者输入了删除键,那么就进入到这个回调了,去读 text 也只能拿到12
UITextFieldDelegate
在 swift
中取消了 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[..<self.index(self.startIndex, offsetBy: index)])
}
func mySubString(from index: Int) -> String {
return String(self[self.index(self.startIndex, offsetBy: index)...])
}
}
当然,如果不熟悉
String
的方法,也可以使用NSString
. 在onevcat
的swift
技巧中有提及到
(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