I want to write a generic method to test all UIControls such as NSTextField, NSTextView, etc. If any required field is empty, a consolidated one warning should be shown for the first control, which will be the focused / first responder.
I implemented something like this:
-(NSInteger)lengthAfterTrimmingSpaces:(NSString *)string{ return [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]; } -(NSDictionary *)createWarningMessageForMandatoryFields:(NSArray *)uiObjects{ NSMutableString *warningString=[NSMutableString stringWithString:@"Enter "]; id firstInvalidatedControl=nil; for (NSDictionary *object in uiObjects) { NSString *key=[object allKeys][0]; id control=object[key]; if ([control isKindOfClass:[NSTextField class]]) { if ([self lengthAfterTrimmingSpaces:[control stringValue]]==0){ [warningString appendString:key]; [warningString appendString:@", "]; if (firstInvalidatedControl==nil) { firstInvalidatedControl=control; } } } else if ([control isKindOfClass:[NSTextView class]]) { if ([self lengthAfterTrimmingSpaces:[control string]]==0){ [warningString appendString:key]; [warningString appendString:@", "]; if (firstInvalidatedControl==nil) { firstInvalidatedControl=control; } } } } if (firstInvalidatedControl==nil) { return @{@"warningString":@"Success"}; } else{ warningString =[[warningString substringToIndex:[warningString length] - 2]mutableCopy]; return @{@"warningString":warningString, @"control":firstInvalidatedControl}; } } -(BOOL)validateMandatoryFields{ NSMutableArray *uiObjects=[NSMutableArray array]; [uiObjects addObject:@{@"Segment Name":self.segmentName}]; [uiObjects addObject:@{@"Code":self.code}]; [uiObjects addObject:@{@"Desciption":self.description}]; NSDictionary *warningAndControl=[self createWarningMessageForMandatoryFields:uiObjects]; if ([warningAndControl[@"warningString"] isEqualToString:@"Success"]) { return YES; } else{ [[self window] makeFirstResponder:warningAndControl[@"control"]]; NSRunAlertPanel(@"Warning", warningAndControl[@"warningString"], @"OK", nil, nil); return NO; } } - (IBAction)save:(id)sender { NSLog(@"%d",[self validateMandatoryFields]); }
Now I want to make it even more general, since for each type I introspect the class and then retrieve the value (stringValue / string, etc.).
Any other suggestions for this are also welcome.
source share