1. 程式人生 > >UITextField監聽刪除按鍵處理IOS8 刪除失效問題

UITextField監聽刪除按鍵處理IOS8 刪除失效問題

.h 檔案

#import <UIKit/UIKit.h>

@protocol TTTextFieldDelegate <UITextFieldDelegate>

@optional
- (void)textFieldDidDeleteBackward:(UITextField *)textField;
@end

@interface UITextField (GTExtend)

@property (weak, nonatomic) id <TTTextFieldDelegate> delegate;

@end

/**
 *  監聽刪除按鈕
 *  object:UITextField
 */
extern NSString * const TTTextFieldDidDeleteBackwardNotification;

.m 檔案

#import "UITextField+GTExtend.h"
#import <objc/runtime.h>

NSString * const TTTextFieldDidDeleteBackwardNotification = @"textfield_did_notification";

@implementation UITextField (GTExtend)

+ (void)load {
    Method method1 = class_getInstanceMethod([self
class], NSSelectorFromString(@"deleteBackward")); Method method2 = class_getInstanceMethod([self class], @selector(tt_deleteBackward)); method_exchangeImplementations(method1, method2); //! 下面這個交換主要解決大於等於8.0小於8.3系統不呼叫deleteBackward的問題 Method method3 = class_getInstanceMethod([self class], NSSelectorFromString(@"keyboardInputShouldDelete:"
)); Method method4 = class_getInstanceMethod([self class], @selector(tt_keyboardInputShouldDelete:)); method_exchangeImplementations(method3, method4); } - (void)tt_deleteBackward { [self tt_deleteBackward]; if ([self.delegate respondsToSelector:@selector(textFieldDidDeleteBackward:)]) { id <TTTextFieldDelegate> delegate = (id<TTTextFieldDelegate>)self.delegate; [delegate textFieldDidDeleteBackward:self]; } [[NSNotificationCenter defaultCenter] postNotificationName:TTTextFieldDidDeleteBackwardNotification object:self]; } - (BOOL)tt_keyboardInputShouldDelete:(UITextField *)textField { BOOL shouldDelete = [self tt_keyboardInputShouldDelete:textField]; BOOL isMoreThanIos8_0 = ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0f); BOOL isLessThanIos8_3 = ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.3f); if (![textField.text length] && isMoreThanIos8_0 && isLessThanIos8_3) { [self deleteBackward]; } return shouldDelete; }