通用驗證欲寫一個通用的方法來驗證所有像的NSTextField,NSTextView等。如果任何強制性字段爲空的UIControls,合併一個警報應與第一控制作爲聚焦/第一反應者被顯示。上輸入
我已經實現了這樣的事情:
-(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]);
}
現在我想讓它更加通用,對於每一種我做一流的反省,然後再檢索值(stringValue的/字符串等)。
此外,任何其他建議表示讚賞。
你所要求的是一個普通程序員的任務。至少將'appendString'等塊移到一個單獨的函數/方法中。或者通過傳遞控制,所需的類,字符串檢索塊/選擇器,警告字符串,鍵和'firstInvalidatedControl'作爲參數來分離整個'isKindOfClass'級別。 – 2013-05-11 07:28:32
單一方法將需要更多的參數,而不是更少的方法。 '[self processControl:control requiredClass:[NSTextField class] warningString:warningString key:key firstInvalidatedControl:&firstInvalidatedControl stringValueSelector:@selector(stringValue)]'。或者,如果您不反對綁定,更好的方法可能是將控件綁定到viewController的屬性並測試它們的屬性(並且完全不考慮控件)。 – 2013-05-11 11:31:48