159 lines
5.4 KiB
Mathematica
159 lines
5.4 KiB
Mathematica
|
|
//
|
||
|
|
// UITextView+BlocksKit.h
|
||
|
|
// BlocksKit
|
||
|
|
//
|
||
|
|
|
||
|
|
#import "UITextView+BlocksKit.h"
|
||
|
|
#import "A2DynamicDelegate.h"
|
||
|
|
#import "NSObject+A2BlockDelegate.h"
|
||
|
|
|
||
|
|
#pragma mark Delegate
|
||
|
|
|
||
|
|
@interface A2DynamicUITextViewDelegate : A2DynamicDelegate
|
||
|
|
|
||
|
|
@end
|
||
|
|
|
||
|
|
@implementation A2DynamicUITextViewDelegate
|
||
|
|
|
||
|
|
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView
|
||
|
|
{
|
||
|
|
BOOL ret = YES;
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewShouldBeginEditing:)])
|
||
|
|
ret = [realDelegate textViewShouldBeginEditing:textView];
|
||
|
|
BOOL (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
ret &= block(textView);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)textViewDidBeginEditing:(UITextView *)textView
|
||
|
|
{
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewDidBeginEditing:)])
|
||
|
|
[realDelegate textViewDidBeginEditing:textView];
|
||
|
|
void (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
block(textView);
|
||
|
|
}
|
||
|
|
|
||
|
|
- (BOOL)textViewShouldEndEditing:(UITextView *)textView
|
||
|
|
{
|
||
|
|
BOOL ret = YES;
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewShouldEndEditing:)])
|
||
|
|
ret = [realDelegate textViewShouldEndEditing:textView];
|
||
|
|
BOOL (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
ret &= block(textView);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)textViewDidEndEditing:(UITextView *)textView
|
||
|
|
{
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewDidEndEditing:)])
|
||
|
|
[realDelegate textViewDidEndEditing:textView];
|
||
|
|
void (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
block(textView);
|
||
|
|
}
|
||
|
|
|
||
|
|
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
|
||
|
|
{
|
||
|
|
BOOL ret = YES;
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)])
|
||
|
|
ret = [realDelegate textView:textView shouldChangeTextInRange:range replacementText:text];
|
||
|
|
BOOL (^block)(UITextView *, NSRange, NSString *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
ret &= block(textView, range, text);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)textViewDidChange:(UITextView *)textView
|
||
|
|
{
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewDidChange:)])
|
||
|
|
[realDelegate textViewDidChange:textView];
|
||
|
|
void (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
block(textView);
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)textViewDidChangeSelection:(UITextView *)textView
|
||
|
|
{
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textViewDidChangeSelection:)])
|
||
|
|
[realDelegate textViewDidChangeSelection:textView];
|
||
|
|
void (^block)(UITextView *) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
block(textView);
|
||
|
|
}
|
||
|
|
|
||
|
|
- (BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange
|
||
|
|
{
|
||
|
|
BOOL ret = YES;
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textView:shouldInteractWithTextAttachment:inRange:)])
|
||
|
|
ret = [realDelegate textView:textView shouldInteractWithTextAttachment:textAttachment inRange:characterRange];
|
||
|
|
BOOL (^block)(UITextView *, NSTextAttachment *, NSRange) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
ret &= block(textView, textAttachment, characterRange);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
|
||
|
|
{
|
||
|
|
BOOL ret = YES;
|
||
|
|
id realDelegate = self.realDelegate;
|
||
|
|
if (realDelegate && [realDelegate respondsToSelector:@selector(textView:shouldInteractWithURL:inRange:)])
|
||
|
|
ret = [realDelegate textView:textView shouldInteractWithURL:URL inRange:characterRange];
|
||
|
|
BOOL (^block)(UITextView *, NSURL *, NSRange) = [self blockImplementationForMethod:_cmd];
|
||
|
|
if (block)
|
||
|
|
ret &= block(textView, URL, characterRange);
|
||
|
|
return ret;
|
||
|
|
}
|
||
|
|
|
||
|
|
@end
|
||
|
|
|
||
|
|
#pragma mark - Category
|
||
|
|
|
||
|
|
@implementation UITextView (BlocksKit)
|
||
|
|
|
||
|
|
@dynamic bk_shouldBeginEditingBlock, bk_didBeginEditingBlock, bk_shouldEndEditingBlock, bk_didEndEditingBlock, bk_shouldChangeCharactersInRangeWithReplacementTextBlock, bk_didChangeBlock, bk_didChangeSelecionBlock, bk_shouldInteractWithTextAttachmentInRangeBlock, bk_shouldInteractWithURLInRangeBlock;
|
||
|
|
|
||
|
|
+ (void)load {
|
||
|
|
[self bk_registerDynamicDelegate];
|
||
|
|
[self bk_linkDelegateMethods: @{
|
||
|
|
@"bk_shouldBeginEditingBlock":
|
||
|
|
@"textViewShouldBeginEditing:",
|
||
|
|
|
||
|
|
@"bk_didBeginEditingBlock":
|
||
|
|
@"textViewDidBeginEditing:",
|
||
|
|
|
||
|
|
@"bk_shouldEndEditingBlock":
|
||
|
|
@"textViewDidBeginEditing:",
|
||
|
|
|
||
|
|
@"bk_didEndEditingBlock" :
|
||
|
|
@"textViewDidEndEditing:",
|
||
|
|
|
||
|
|
@"bk_shouldChangeCharactersInRangeWithReplacementTextBlock" :
|
||
|
|
@"textView:shouldChangeTextInRange:replacementText:",
|
||
|
|
|
||
|
|
@"bk_didChangeBlock" :
|
||
|
|
@"textViewDidChange:",
|
||
|
|
|
||
|
|
@"bk_didChangeSelecionBlock" :
|
||
|
|
@"textViewDidChangeSelection:",
|
||
|
|
|
||
|
|
@"bk_shouldInteractWithTextAttachmentInRangeBlock" :
|
||
|
|
@"textView:shouldInteractWithTextAttachment:inRange:",
|
||
|
|
|
||
|
|
@"bk_shouldInteractWithURLInRangeBlock" :
|
||
|
|
@"textView:shouldInteractWithURL:inRange:",
|
||
|
|
}];
|
||
|
|
}
|
||
|
|
|
||
|
|
@end
|