Swift 踩坑筆記(三)—— UITextField 的坑

綜述

設(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

UITextFieldDelegateswift 中取消了 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. 在onevcatswift技巧中有提及到
(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)一個登錄之類的輸入框,類似于下面這樣:

image.png

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

image.png

下面的代碼實際上是去創(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,228評論 3 119
  • 以一顆善良的心為溫度 行走于晝夜之外 云霄落在堅硬的烙鐵上 火紅的嘴唇張開 小鬼說出地獄的今生 我在判官的筆下游走...
    竹鴻初閱讀 395評論 1 2
  • 每天到外面散步的時候,總是認為不能碌碌無為。 睡覺、干活、吃飯、休息、有時領(lǐng)導(dǎo)吩咐的事辦不好了還挨屌!就是...
    e56448722ba5閱讀 273評論 0 1
  • 今天一個朋友跟我聊天,與其說聊天,倒不如說是訴苦或者發(fā)泄吧。 事情大概是這樣的。朋友了解到重疾險的重要性,然后了解...
    Michiko七七閱讀 181評論 0 0

友情鏈接更多精彩內(nèi)容