綜述
設(shè)計四個問題
- 如何從
UITextField的回調(diào)中實時獲取text文本 - 如何限制文字的上限,比如登錄時,手機號最多11位
- 當(dāng)前情況下,如何截取字符串
- 在左側(cè)/右側(cè)添加圖片的占位方法
如何從 UITextField 的回調(diào)中實時獲取 text 文本
注:另一個 回調(diào)
shouldChangeCharacter只能獲取到輸入成功之前的,比如我現(xiàn)在 text 中是12, 這時候鍵盤輸入了一個3,或者輸入了刪除鍵,那么就進入到這個回調(diào)了,去讀 text 也只能拿到12
UITextFieldDelegate 在 swift 中取消了 textFieldDidChange這個OC 中的回調(diào)
需要自己實現(xiàn)textFieldDidChange, 這個回調(diào)是實時監(jiān)聽 text 內(nèi)容的
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)...])
}
}
當(dāng)然,如果不熟悉
String的方法,也可以使用NSString. 在onevcat的swift技巧中有提及到
(strInstance as NSString)之后,再通過點調(diào)用就可以拿到我們之前熟悉的NSString方法了
如何限制文字的上限,比如登錄時,手機號最多11位
這里直接判斷text的長度,在輸入中文時會有坑,所以判讀輸入格式,然后判斷是否存在被mark的text,在中文輸入的過程中的字母就是被mark的,如果沒有mark就判斷長度,這樣就能夠?qū)崿F(xiàn)我們想要的效果了
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)
}
}
在左側(cè)/右側(cè)添加圖片的占位方法
這一點其實和 Swift無關(guān)了,因為OC本身也有這個功能
我們經(jīng)常要實現(xiàn)一個登錄之類的輸入框,類似于下面這樣:

要么我們自己去封裝,要么直接使用UITextField的左右填充屬性來實現(xiàn)

下面的代碼實際上是去創(chuàng)建一個frame 布局的控件用來填充UITextField左側(cè)的圖像展示區(qū),這時候布局和約束無關(guān)
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