我在项目中使用pod 倒入了BlocksKit 发现了一个crash问题
iOS中 只要是 输入文本类型的 UItextFile UItextView UIWeb 等 都会出现crash现象
1 出现流程 在输入框 输入中文后 双击 点击都可以 点击添加
如图
这样就出现了循环调用 查看到的堆栈 如图
查看了下 BlocksKit 作者并没有对这个更新 并且 只有是中文输入的时候 才会出现 crash
只好自己修改了 具体代码如下 修改 UITextField+BlocksKit.m文件
//
// UITextField+BlocksKit.m
// BlocksKit
//
#import "UITextField+BlocksKit.h"
#import "A2DynamicDelegate.h"
#import "NSObject+A2BlockDelegate.h"
#pragma mark Delegate
@interface A2DynamicUITextFieldDelegate : A2DynamicDelegate
@end
@implementation A2DynamicUITextFieldDelegate
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
BOOL ret = YES;
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return ret;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)])
ret = [realDelegate textFieldShouldBeginEditing:textField];
BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
ret &= block(textField);
return ret;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)])
[realDelegate textFieldDidBeginEditing:textField];
void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
block(textField);
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
BOOL ret = YES;
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return ret;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)])
ret = [realDelegate textFieldShouldEndEditing:textField];
BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
ret &= block(textField);
return ret;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidEndEditing:)])
[realDelegate textFieldDidEndEditing:textField];
void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
block(textField);
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
BOOL ret = YES;
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)])
ret = [realDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
BOOL (^block)(UITextField *, NSRange, NSString *) = [self blockImplementationForMethod:_cmd];
if (block)
ret &= block(textField, range, string);
return ret;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField
{
BOOL ret = YES;
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return ret;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldClear:)])
ret = [realDelegate textFieldShouldClear:textField];
BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
ret &= block(textField);
return ret;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
BOOL ret = YES;
id realDelegate = self.realDelegate;
//添加代码
if (realDelegate && [realDelegate isKindOfClass:NSClassFromString(@"UIEditUserWordController")]) {
return;
}
//end
if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldReturn:)])
ret = [realDelegate textFieldShouldReturn:textField];
BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
if (block)
ret &= block(textField);
return ret;
}
@end
#pragma mark - Category
@implementation UITextField (BlocksKit)
@dynamic bk_shouldBeginEditingBlock, bk_didBeginEditingBlock, bk_shouldEndEditingBlock, bk_didEndEditingBlock, bk_shouldChangeCharactersInRangeWithReplacementStringBlock, bk_shouldClearBlock, bk_shouldReturnBlock;
+ (void)load {
[self bk_registerDynamicDelegate];
[self bk_linkDelegateMethods: @{
@"bk_shouldBeginEditingBlock": @"textFieldShouldBeginEditing:",
@"bk_didBeginEditingBlock": @"textFieldDidBeginEditing:",
@"bk_shouldEndEditingBlock": @"textFieldShouldEndEditing:",
@"bk_didEndEditingBlock" : @"textFieldDidEndEditing:",
@"bk_shouldChangeCharactersInRangeWithReplacementStringBlock" : @"textField:shouldChangeCharactersInRange:replacementString:",
@"bk_shouldClearBlock" : @"textFieldShouldClear:",
@"bk_shouldReturnBlock" : @"textFieldShouldReturn:",
}];
}
@end
参考文献https://github.com/rtanote/BlocksKit/commit/9942082b148e58f4f96fed3336627ed74557d733