美文网首页
Swift-UITextField扩展(监听文字内容改变)

Swift-UITextField扩展(监听文字内容改变)

作者: SK丿希望 | 来源:发表于2018-09-28 11:30 被阅读0次

    前言
    由于开发过程中,编辑框经常会被使用到,当我们需要监听一些编辑操作是需要成为代理,并且还需要实现代理方法,往往需要花费大量时间,之前用RXSwift,但是感觉还是不怎么方便,后面自己封装了一套比较实用,在不修改原来代码的基础上,快速调用代理方法,可以根据自己的需要进行扩展,原理也非常简单,希望对您有所帮助 😂

    案例

           /// 值改变
           tf.hw.valuesChangeBlock = {
                print("第一个:\($0)")
           }
           /// 开始编辑回调
           tf.hw.beginEditingBlock = {
                print("第一个开始输入")
            }
           /// 结束编辑回调
           tf.hw.endEditingBlock = { [weak self] (text) in
    
           }
           /// 人民币输入
           tf.hw.isMoeeyEidtor(true).endEditingBlock = { (text) in
                print("输入金额为:\(text)")
           }
    
    image.png image.png image.png

    实现原理

    import UIKit
    
    extension UITextField {
        private struct RuntimeKey {
            static let hw_TextFieldKey = UnsafeRawPointer.init(bitPattern: "hw_TextField".hashValue)
            /// ...其他Key声明
        }
        /// 运行时关联
        var hw: hw_TextField {
            set {
                objc_setAssociatedObject(self, UITextField.RuntimeKey.hw_TextFieldKey!, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
            get {
                var obj = objc_getAssociatedObject(self, UITextField.RuntimeKey.hw_TextFieldKey!) as? hw_TextField
                if obj == nil { // 没有是手动创建 并进行绑定
                    obj = hw_TextField.init(self)
                    objc_setAssociatedObject(self, UITextField.RuntimeKey.hw_TextFieldKey!, obj, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                }
                return obj!
            }
        }
        
    }
    class hw_TextField: NSObject, UITextFieldDelegate{
        private weak var tf: UITextField? // 定义属性用于临时记录
        /// 值改变回调
        var valuesChangeBlock: ((String)->())?
        /// 结束编辑回调(未输入是不会回调)
        var endEditingBlock: ((String)->())?
        /// 开始编辑
        var beginEditingBlock:(()->())?
        /// 是否是人民币输入
        @discardableResult
        func isMoeeyEidtor(_ isMoeey: Bool) -> hw_TextField {
            isMoeeyEidtor = isMoeey
            return self
        }
        private var _isMoeeyEidtor =  false
        private var pointlocation:Int = -1 // 用于记录小数点位置
        private var isMoeeyEidtor : Bool {
            set {
                _isMoeeyEidtor = newValue
                self.tf?.keyboardType = .decimalPad
            }
            get {
                return _isMoeeyEidtor
            }
        }
        
        convenience init(_ tf: UITextField) {
            self.init()
            self.tf = tf
            self.tf?.delegate = self
            self.tf!.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
        }
        @objc private func editingChanged() {
            if valuesChangeBlock == nil {return}
            valuesChangeBlock!(tf?.text ?? "")
        }
        
        override init() {
            super.init()
        }
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func textFieldDidEndEditing(_ textField: UITextField) {
            if endEditingBlock == nil {return}
            if (textField.text ?? "").isEmpty {return}
            endEditingBlock!(textField.text ?? "")
        }
        func textFieldDidBeginEditing(_ textField: UITextField) {
            if beginEditingBlock == nil {return}
            beginEditingBlock!()
        }
        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            if isMoeeyEidtor == true {
                if string == "."{ // 记录小数点位置
                    pointlocation = range.location
                }
                if range.location == 0 { // 首位不能为小数点
                    if string == "." { return false }
                }
                if textField.text == "0"{
                    if string == "." || string == "" {
                        return true
                    } else {
                        return false
                    }
                }
                if (textField.text?.contains("."))! { // 包含小数点 后面不能再输入小数点
                    if string == "." {  return false }
                }
                if pointlocation != -1 {
                    if range.location > pointlocation + 2 {  return false } // 小数点后2位
                }
            }
            return true
        }
        deinit {
            self.tf?.delegate = nil
        }
    }
    

    Dome

    相关文章

      网友评论

          本文标题:Swift-UITextField扩展(监听文字内容改变)

          本文链接:https://www.haomeiwen.com/subject/ynguoftx.html