From da33fdb9e75903fa0dc294cf189b291a8a2d1004 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Wed, 8 Jul 2015 22:02:10 +0300 Subject: [PATCH 1/2] Don't set format in awakeFromNib as it can hide format from interface builder --- REFormattedNumberField/REFormattedNumberField.m | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/REFormattedNumberField/REFormattedNumberField.m b/REFormattedNumberField/REFormattedNumberField.m index e6e3de1..9be0610 100644 --- a/REFormattedNumberField/REFormattedNumberField.m +++ b/REFormattedNumberField/REFormattedNumberField.m @@ -34,6 +34,11 @@ @interface REFormattedNumberField () @implementation REFormattedNumberField +- (NSString*)format +{ + return _format ?: @"X"; +} + - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:(CGRect)frame]; @@ -52,7 +57,6 @@ - (void)awakeFromNib - (void)commonInit { self.keyboardType = UIKeyboardTypeNumberPad; - self.format = @"X"; [super setDelegate:self]; [self addTarget:self action:@selector(formatInput:) forControlEvents:UIControlEventEditingChanged]; } From 69caa7601ed154c9dd8ab43950d68b7c1d83ec16 Mon Sep 17 00:00:00 2001 From: Igor Palaguta Date: Mon, 23 Nov 2015 11:55:12 +0200 Subject: [PATCH 2/2] Fix -[UITextField customOverlayContainer] SIGSTOP --- .../REFormattedNumberField.m | 97 +++++++++++-------- .../project.pbxproj | 2 + 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/REFormattedNumberField/REFormattedNumberField.m b/REFormattedNumberField/REFormattedNumberField.m index 9be0610..2e47f70 100644 --- a/REFormattedNumberField/REFormattedNumberField.m +++ b/REFormattedNumberField/REFormattedNumberField.m @@ -25,10 +25,55 @@ #import "REFormattedNumberField.h" +@interface REFormattedNumberFieldDelegate: NSObject + +@property (nonatomic, weak) id originalDelegate; + +@end + +@implementation REFormattedNumberFieldDelegate + +- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string +{ + if (range.length == 1 && string.length==0) { + [textField deleteBackward]; + return NO; + } + + if ([self.originalDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) { + return [self.originalDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string]; + } + + return YES; +} + +#pragma mark - +#pragma mark NSObject method overrides + +- (id)forwardingTargetForSelector:(SEL)aSelector +{ + if ([self.originalDelegate respondsToSelector:aSelector] && self.originalDelegate != self) { + return self.originalDelegate; + } + return [super forwardingTargetForSelector:aSelector]; +} + +- (BOOL)respondsToSelector:(SEL)aSelector +{ + BOOL respondsToSelector = [super respondsToSelector:aSelector]; + + if (!respondsToSelector && self.originalDelegate != self) { + respondsToSelector = [self.originalDelegate respondsToSelector:aSelector]; + } + return respondsToSelector; +} + +@end + @interface REFormattedNumberField () @property (copy, readwrite, nonatomic) NSString *currentFormattedText; -@property (nonatomic, weak) id originalDelegate; +@property (nonatomic, strong) REFormattedNumberFieldDelegate *strongDelegate; @end @@ -39,6 +84,13 @@ - (NSString*)format return _format ?: @"X"; } +- (REFormattedNumberFieldDelegate*)strongDelegate { + if (!_strongDelegate) { + _strongDelegate = [REFormattedNumberFieldDelegate new]; + } + return _strongDelegate; +} + - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:(CGRect)frame]; @@ -56,8 +108,8 @@ - (void)awakeFromNib - (void)commonInit { + self.delegate = self.strongDelegate; self.keyboardType = UIKeyboardTypeNumberPad; - [super setDelegate:self]; [self addTarget:self action:@selector(formatInput:) forControlEvents:UIControlEventEditingChanged]; } @@ -133,21 +185,9 @@ - (NSString *)unformattedText return [unformattedText copy]; } -#pragma mark - -#pragma mark UITextFieldDelegate - -- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string ++ (NSSet*)keyPathsForValuesAffectingUnformattedText { - if (range.length == 1 && string.length==0) { - [self deleteBackward]; - return NO; - } - - if ([self.originalDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) { - return [self.originalDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string]; - } - - return YES; + return [NSSet setWithObject: @"currentFormattedText"]; } #pragma mark - @@ -156,34 +196,13 @@ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRang - (void)setDelegate:(id)delegate { [self willChangeValueForKey:@"delegate"]; - self.originalDelegate = delegate; + self.strongDelegate.originalDelegate = delegate; [self didChangeValueForKey:@"delegate"]; } - (id)delegate { - return self.originalDelegate; -} - -#pragma mark - -#pragma mark NSObject method overrides - -- (id)forwardingTargetForSelector:(SEL)aSelector -{ - if ([self.originalDelegate respondsToSelector:aSelector] && self.originalDelegate != self) { - return self.originalDelegate; - } - return [super forwardingTargetForSelector:aSelector]; -} - -- (BOOL)respondsToSelector:(SEL)aSelector -{ - BOOL respondsToSelector = [super respondsToSelector:aSelector]; - - if (!respondsToSelector && self.originalDelegate != self) { - respondsToSelector = [self.originalDelegate respondsToSelector:aSelector]; - } - return respondsToSelector; + return self.strongDelegate.originalDelegate; } @end diff --git a/REFormattedNumberFieldExample/REFormattedNumberFieldExample.xcodeproj/project.pbxproj b/REFormattedNumberFieldExample/REFormattedNumberFieldExample.xcodeproj/project.pbxproj index 074b448..cb5007f 100644 --- a/REFormattedNumberFieldExample/REFormattedNumberFieldExample.xcodeproj/project.pbxproj +++ b/REFormattedNumberFieldExample/REFormattedNumberFieldExample.xcodeproj/project.pbxproj @@ -61,7 +61,9 @@ 30E0F8B616D6ECBB001949EA /* Frameworks */, 30E0F8B516D6ECBB001949EA /* Products */, ); + indentWidth = 4; sourceTree = ""; + tabWidth = 4; }; 30E0F8B516D6ECBB001949EA /* Products */ = { isa = PBXGroup;