美文网首页
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