2013-05-11 17 views
0

通用驗證欲寫一個通用的方法來驗證所有像的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的/字符串等)。

此外,任何其他建議表示讚賞。

+0

你所要求的是一個普通程序員的任務。至少將'appendString'等塊移到一個單獨的函數/方法中。或者通過傳遞控制,所需的類,字符串檢索塊/選擇器,警告字符串,鍵和'firstInvalidatedControl'作爲參數來分離整個'isKindOfClass'級別。 – 2013-05-11 07:28:32

+0

單一方法將需要更多的參數,而不是更少的方法。 '[self processControl:control requiredClass:[NSTextField class] warningString:warningString key:key firstInvalidatedControl:&firstInvalidatedControl stringValueSelector:@selector(stringValue)]'。或者,如果您不反對綁定,更好的方法可能是將控件綁定到viewController的屬性並測試它們的屬性(並且完全不考慮控件)。 – 2013-05-11 11:31:48

回答

0

你對將要呈現給用戶的字符串的內容基礎邏輯(決定是否有錯誤)。你不應該。相反,將邏輯基於密鑰(control),因爲它們是不可變的。與此一起,您應該使用NSLocalizedString來驗證代碼的重用性。

對於反省,我會考慮把這些方法爲工具類的加入了許多種類的成類也。這些類別會爲每個NSControl子類添加一個方法,目的是通過始終調用具有相同名稱的方法來獲取它們的stringValue。對於NSTextField,你不需要一個類別。對於NSTextView類別是:

@implementation NSTextView (MyStringValue) 

- (NSString *)stringValue 
{ 
    return [self string]; 
} 

@end 

您的代碼應該仍然驗證類響應stringValue選擇,如果沒有它不能被驗證。

0

綁定控件來查看控制器的屬性可能會有所幫助。

@interface MyViewController 

@property(nonatomic,copy) NSString *string; 
@property(nonatomic,copy) NSDate *date; 
@property(nonatomic,copy) NSNumber *number; 

@end 

現在你綁定控制值文件所有者的string/date/number性能。

@implementation MyViewController 

- (void)testForm 
{ 
    for (NSString *key in @[@"string", @"date", @"number"]) { 
     id value = [self valueForKey:key]; 
     if (value == nil || [value isEqual:@""] || [value isEqual:@(0.0)] || ...) { 
      // empty field 
     } 
    } 
} 

注意你真實的數據在這裏工作,即,如果您有日期/數字領域,你不檢查理智的它的stringValue的(也就是格式化的工作),但已經轉換/格式化值。