【发布时间】:2013-05-11 07:00:22
【问题描述】:
我想编写一个通用方法来验证所有 UIControls,如 NSTextField、NSTextView 等。如果任何必填字段为空,则应显示一个合并的警报,其中第一个控件作为焦点/第一响应者。
我已经实现了这样的东西:
-(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/string 等)。
对此还有任何其他建议表示赞赏。
【问题讨论】:
-
您要求的是普通程序员的任务。至少将
appendStringetc 块移动到单独的函数/方法。或者通过传递控制、所需类、字符串检索块/选择器、警告字符串、键和firstInvalidatedControl作为参数来分隔整个isKindOfClass级别。 -
采用更多参数的单一方法,而不是更多方法。
[self processControl:control requiredClass:[NSTextField class] warningString:warningString key:key firstInvalidatedControl:& firstInvalidatedControl stringValueSelector:@selector(stringValue)]。或者,如果您不反对绑定,更好的方法可能是将控件绑定到 viewController 的属性并测试它们的属性(完全忘记控件)。
标签: objective-c macos cocoa