iOS swift UITextField 输入限制 UITextView 原理一样

133 阅读1分钟

UITextField 输入限制, UITextView 原理一样

// MARK: -- UITextFieldDelegate
extension LZViewController: UITextFieldDelegate {
    /// return 键点击 called when 'return' key pressed. return NO to ignore.
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        //self.returnClick()
        return true
    }
    /// return NO to not change text
    /// - Parameters:
    ///   - textField: <#textField description#>
    ///   - range: UITextField控件中光标选中的字符串,即被替换的字符串;range.length为0时,表示在位置range.location插入string
    ///   - string: 替换字符串;string.length为0时,表示删除
    /// - Returns: <#description#>
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        let oldFieldText = textField.text ?? ""
        let sRange = Range(range, in: oldFieldText)
        var willNewFieldText = oldFieldText // 新字符串预计
        if let sRange = sRange {
            willNewFieldText = oldFieldText.replacingCharacters(in: sRange, with: string)
        }
        /// 实际新字符串
        var newFieldText = oldFieldText
        
        defer {//最后 判断
            let newTextInt = Int(newFieldText) ?? 0
            根据  新字符串 ,判断按钮状态
            //self.confirmButton.isEnabled = (newTextInt > 0) && (newTextInt <= 99999)
        }
        // 检查是否是删除操作
        if string == "" {
            newFieldText = willNewFieldText
            return true
        }
                // 新字符串长度 = 原来字符串长度 - 被替换字符串长度 + 新字符串长度
        let newCount = (textField.text?.count ?? 0) - range.length + string.count
        
        let isNum = string.isNum
        if !isNum {
            MBProgressHUDHelper.showWarning(text: "请输入数字")
            newFieldText = oldFieldText
            return false
        }
        // 限制输入5个字符 最大99999
        if newCount > 5 {
            newFieldText = oldFieldText
            return false
        }
        newFieldText = willNewFieldText
        return true
    }
}