前言
由于开发过程中,编辑框经常会被使用到,当我们需要监听一些编辑操作是需要成为代理,并且还需要实现代理方法,往往需要花费大量时间,之前用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
}
}
网友评论