Skip to content

Commit 7d55eb9

Browse files
committed
Fixed all validation.
1 parent 5afe777 commit 7d55eb9

File tree

8 files changed

+78
-7
lines changed

8 files changed

+78
-7
lines changed

KVC Validation Pattern/KVC Validation Pattern/CTCViewController.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,9 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
170170

171171
if (address != nil) {
172172
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@\n %@, %@ %@", address.street, address.city, address.state, address.zip];
173-
}
173+
} else {
174+
cell.detailTextLabel.text = @"";
175+
}
174176

175177
cell.detailTextLabel.numberOfLines = 2;
176178
}

KVC Validation Pattern/KVC Validation Pattern/Model/CTCAddress.m

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,25 @@
88

99

1010
#import "CTCAddress.h"
11+
#import "CTCStringTypeValidator.h"
12+
#import "NSString+Utilities.h"
1113

1214

13-
@implementation CTCAddress
15+
@implementation CTCAddress{
16+
CTCStringTypeValidator *_zipValidator;
17+
dispatch_once_t _onceToken;
18+
}
19+
20+
- (BOOL)validateZip:(id *)ioValue error:(NSError *__autoreleasing *)outError{
21+
dispatch_once(&_onceToken, ^{
22+
_zipValidator = [CTCStringTypeValidator new];
23+
_zipValidator.postValidation = ^NSString *(id value){
24+
value = [NSString leftPadString:value length:5 padCharacter:@"0"];
25+
return value;
26+
};
27+
});
28+
return [_zipValidator validateValue:ioValue error:outError];
29+
}
1430

1531
- (NSString *)description {
1632
return [[super description] stringByAppendingFormat:@" (street=\"%@\", city=\"%@\", state=\"%@\", zip=\"%@\"", self.street, self.city, self.state, self.zip];

KVC Validation Pattern/KVC Validation Pattern/Model/CTCBaseModel.m

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ - (void)setValue:(id)value forKey:(NSString *)key properCase:(BOOL)properCase {
8181
}
8282

8383
NSError *error = nil;
84-
BOOL isValid = YES;
85-
[self validateValue:&value forKey:key error:&error];
84+
BOOL isValid = [self validateValue:&value forKey:key error:&error];
8685

8786
if (isValid) {
8887
[super setValue:value forKey:key];

KVC Validation Pattern/KVC Validation Pattern/Model/NSString+Utilities.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,8 @@
1313

1414
+ (NSString *)capitalizeFirstCharacter:(NSString *)string;
1515

16+
+ (NSString *)stripNonNumericCharacters:(NSString *)string;
17+
18+
+ (NSString *)leftPadString:(NSString *)string length:(NSUInteger)length padCharacter:(NSString *)padCharacter;
19+
1620
@end

KVC Validation Pattern/KVC Validation Pattern/Model/NSString+Utilities.m

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,29 @@ + (NSString *)capitalizeFirstCharacter:(NSString *)string {
1818
return cappedString;
1919
}
2020

21+
+ (NSString *)stripNonNumericCharacters:(NSString *)string {
22+
NSMutableString *res = [[NSMutableString alloc] init];
23+
24+
for(int i = 0; i < [string length]; i++) {
25+
char next = (char) [string characterAtIndex:(NSUInteger) i];
26+
27+
if((next >= '0' && next <= '9') || next == '.') {
28+
[res appendFormat:@"%c", next];
29+
}
30+
}
31+
32+
return res;
33+
34+
}
35+
36+
+ (NSString *)leftPadString:(NSString *)string length:(NSUInteger)length padCharacter:(NSString *)padCharacter {
37+
NSUInteger padding = length - [string length];
38+
if (padding > 0){
39+
NSString *pad = [[NSString string] stringByPaddingToLength:padding withString:padCharacter startingAtIndex:0];
40+
return [pad stringByAppendingString:string];
41+
}
42+
return string;
43+
}
44+
45+
2146
@end

KVC Validation Pattern/KVC Validation Pattern/Model/Validation/CTCBooleanTypeValidator.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ - (id)init {
1919
if (self) {
2020
self.defaultValidation = ^NSNumber * (id value, BOOL *isValid, NSError **error){
2121
*isValid = YES;
22-
NSString *stringValue;
22+
NSString *stringValue = @"NO";
2323
if ([value isKindOfClass:[NSString class]]){
2424
stringValue = value;
2525
} else if ([value respondsToSelector:@selector(stringValue)]){

KVC Validation Pattern/KVC Validation Pattern/Model/Validation/CTCDateTypeValidator.m

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,39 @@
99

1010
#import "CTCDateTypeValidator.h"
1111

12-
1312
@implementation CTCDateTypeValidator {
1413

1514
}
1615
- (id)init {
1716
self = [super init];
1817
if (self) {
1918
self.defaultValidation = ^NSDate *(id value, BOOL *isValid, NSError **error){
20-
if ([value respondsToSelector:@selector(integerValue)]){
19+
if ([value isKindOfClass:[NSNumber class]]){
2120
*isValid = YES;
2221
return [NSDate dateWithTimeIntervalSince1970:[value integerValue]];
2322
}
23+
static NSDateFormatter *dateFormatter;
24+
static dispatch_once_t onceToken;
25+
static dispatch_queue_t dateQueue;
26+
dispatch_once(&onceToken, ^{
27+
dateFormatter = [NSDateFormatter new];
28+
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];
29+
dateQueue = dispatch_queue_create("com.captech.datequeue", NULL);
30+
});
31+
NSString *stringDate;
32+
if ([value isKindOfClass:[NSString class]]){
33+
stringDate = value;
34+
} else if ([value respondsToSelector:@selector(stringValue)]){
35+
stringDate = [value stringValue];
36+
}
37+
if (stringDate){
38+
*isValid = YES;
39+
__block NSDate *date;
40+
dispatch_sync(dateQueue, ^{
41+
date = [dateFormatter dateFromString:stringDate];
42+
});
43+
return date;
44+
}
2445
*isValid = NO;
2546
return nil;
2647
};

KVC Validation Pattern/KVC Validation Pattern/Model/Validation/CTCFloatTypeValidator.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010
#import "CTCFloatTypeValidator.h"
11+
#import "NSString+Utilities.h"
1112

1213

1314
@implementation CTCFloatTypeValidator {
@@ -18,6 +19,9 @@ - (id)init {
1819
if (self) {
1920
self.defaultValidation = ^NSNumber * (id value, BOOL *isValid, NSError **error){
2021
*isValid = YES;
22+
if ([value isKindOfClass:[NSString class]]){
23+
value = [NSString stripNonNumericCharacters:value];
24+
}
2125
if ([value respondsToSelector:@selector(floatValue)]){
2226
return @([value floatValue]);
2327
}

0 commit comments

Comments
 (0)