extension UITextField {
private struct DelegateKeys {
static var multicastDelegate = "multicastDelegate"
}
private var multicastDelegate: TextFieldMulticastDelegate? {
get { objc_getAssociatedObject(self, &DelegateKeys.multicastDelegate) as? TextFieldMulticastDelegate }
set { objc_setAssociatedObject(self, &DelegateKeys.multicastDelegate, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) }
}
@objc private func _setDelegate(_ delegate: UITextFieldDelegate?) {
if self is MaskedFieldProtocol {
if let delegate = delegate {
if let del = multicastDelegate {
del.multicastDelegate.add(delegate)
_setDelegate(del)
} else {
let multicastDel = TextFieldMulticastDelegate(delegates: [delegate])
self.multicastDelegate = multicastDel
_setDelegate(multicastDel)
}
} else {
}
} else {
_setDelegate(delegate)
}
}
@objc private func _getDelegate() -> UITextFieldDelegate? {
self is MaskedFieldProtocol ? multicastDelegate : _getDelegate()
}
static let swizzle: Void = {
let getterOriginalSelector = #selector(getter: UITextField.delegate)
let setterOriginalSelector = #selector(setter: UITextField.delegate)
let getterSwizzledSelector = #selector(_getDelegate)
let setterSwizzledSelector = #selector(_setDelegate)
guard
let getterOriginalMethod = class_getInstanceMethod(UITextField.self, getterOriginalSelector),
let setterOriginalMethod = class_getInstanceMethod(UITextField.self, setterOriginalSelector),
let getterSwizzledMethod = class_getInstanceMethod(UITextField.self, getterSwizzledSelector),
let setterSwizzledMethod = class_getInstanceMethod(UITextField.self, setterSwizzledSelector)
else { return }
method_exchangeImplementations(getterOriginalMethod, getterSwizzledMethod)
method_exchangeImplementations(setterOriginalMethod, setterSwizzledMethod)
}()
}
final class TextFieldMulticastDelegate: NSObject, UITextFieldDelegate {
let multicastDelegate = MulticastDelegate<UITextFieldDelegate>()
init(delegates: [UITextFieldDelegate]) {
super.init()
delegates.forEach { multicastDelegate.add($0) }
}
**определяем методы**
}
protocol MaskedFieldProtocol: class { }
extension MaskedFieldProtocol where Self: UITextField { } устанавливаю delegate на self, и использую необходимые методы делегата
Использую просто:
class TF: UITextField, MaskedFieldProtocol {
bla bla bla
}