, . , , textView:shouldChangeTextInRange:replacementText:, .
#import "INFTextView.h"
@interface INFTextView () <UITextViewDelegate>
@property (nonatomic, weak) id<UITextViewDelegate> externalDelegate;
@end
@implementation INFTextView
- (id)init {
self = [super init];
if (!self) {
return nil;
}
self.delegate = self;
return self;
}
- (void)awakeFromNib {
self.delegate = self;
}
- (void)setDelegate:(id<UITextViewDelegate>)delegate {
if (delegate == self) {
[super setDelegate:self];
return;
} else {
_externalDelegate = delegate;
}
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
NSCharacterSet *unsupportedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:kINFSupportedCharacters] invertedSet];
NSRange unsupportedCharacterRange = [text rangeOfCharacterFromSet:unsupportedCharacterSet];
if (unsupportedCharacterRange.location == NSNotFound) {
return YES;
} else {
return NO;
}
}
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewShouldBeginEditing:)]) {
return [_externalDelegate textViewShouldBeginEditing:textView];
}
return YES;
}
- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewShouldEndEditing:)]) {
return [_externalDelegate textViewShouldEndEditing:textView];
}
return YES;
}
- (void)textViewDidBeginEditing:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewDidBeginEditing:)]) {
[_externalDelegate textViewDidBeginEditing:textView];
}
}
- (void)textViewDidEndEditing:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewDidEndEditing:)]) {
[_externalDelegate textViewDidEndEditing:textView];
}
}
- (void)textViewDidChange:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewDidChange:)]) {
[_externalDelegate textViewDidChange:textView];
}
}
- (void)textViewDidChangeSelection:(UITextView *)textView {
if ([_externalDelegate respondsToSelector:@selector(textViewDidChangeSelection:)]) {
[_externalDelegate textViewDidChangeSelection:textView];
}
}
@end
One big flip-flop that led me to this question was that I was trying to override delegateto return _externalDelegate, but it caused some strange side effects (there should be an internal code that depends on the actual delegate being returned).
source
share