响应键盘删除按钮的事件,常规的是根据UITextfield或者UISearchBar的didChange代理方法中内同的改变来判断是否进行了点击删除按钮。但是当输入框没有内容时,就无法捕捉到删除的事件了。例如微信选择好友时用键盘的删除按钮删除已选择的好友头像。
实现的思路是利用OC的运行时机制,替换掉系统的删除runtime函数。首先建一个UItextfield的category:UITextField+YX
头文件代码:
#import
@protocol YXTextFieldDelegate
@optional
- (void)textFieldDidDeleteBackward:(UITextField *)textField;
@end
@interface UITextField (YX)
@property (weak, nonatomic) id delegate;
@end
extern NSString * const YXTextFieldDidDeleteBackwardNotification;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
源文件中的代码:
#import "UITextField+YX.h"
#import
NSString * const YXTextFieldDidDeleteBackwardNotification = @"textfield_did_notification";
@implementation UITextField(YX)
+ (void)load {
Method method1 = class_getInstanceMethod([self class], NSSelectorFromString(@"deleteBackward"));
Method method2 = class_getInstanceMethod([self class], @selector(yx_deleteBackward));
method_exchangeImplementations(method1, method2);
}
- (void)yx_deleteBackward {
[self yx_deleteBackward];
if ([self.delegate respondsToSelector:@selector(textFieldDidDeleteBackward:)])
{
id delegate = (id)self.delegate;
[delegate textFieldDidDeleteBackward:self];
}
[[NSNotificationCenter defaultCenter] postNotificationName:YXTextFieldDidDeleteBackwardNotification object:self];
}
@end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
在使用的文件中遵循YXTextFieldDelegate代理,代理的方法即为点击删除按钮事件:
- (void)textFieldDidDeleteBackward:(UITextField *)textField {
//删除事件
}