2013-04-18 128 views
3

我在MainMenu.xib中有一個NSText字段,並且設置了一個操作來驗證它是否適用於電子郵件地址。我希望NSTexFields邊框顏色(藍色發光)在我的動作返回NO時顯示爲紅色,並在動作返回YES時顯示爲綠色。這裏是動作:更改NSTextField的邊框「發光」顏色

-(BOOL) validEmail:(NSString*) emailString { 
    NSString *regExPattern = @"^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,4}$"; 
    NSRegularExpression *regEx = [[NSRegularExpression alloc] initWithPattern:regExPattern  options:NSRegularExpressionCaseInsensitive error:nil]; 
    NSUInteger regExMatches = [regEx numberOfMatchesInString:emailString options:0 range:NSMakeRange(0, [emailString length])]; 
    NSLog(@"%ld", regExMatches); 
    if (regExMatches == 0) { 
     return NO; 
    } else 
     return YES; 
} 

我調用此函數而現在設置文本的顏色,但我想設置的NSTextField的發光顏色來代替。

- (void) controlTextDidChange:(NSNotification *)obj{ 
    if ([obj object] == emailS) { 
     if ([self validEmail:[[obj object] stringValue]]) { 
      [[obj object] setTextColor:[NSColor colorWithSRGBRed:0 green:.59 blue:0 alpha:1.0]]; 
      [reviewButton setEnabled:YES]; 
     } else { 
      [[obj object] setTextColor:[NSColor colorWithSRGBRed:.59 green:0 blue:0 alpha:1.0]]; 
      [reviewButton setEnabled:NO]; 
     } 
    } 
} 

我打開子類NSTextField,但最乾淨的方式來做到這一點將不勝感激!

+0

你有沒有想出解決辦法?我正在尋找同樣的事情。我不知道在Cocoa中是否有標準的方式來表明一個無效的字段。 –

回答

0

要做到這一點的方法是子類NSTextFieldCell並繪製自己的焦點環。據我所知,無法告訴系統使用自己的顏色繪製對焦環,因此您必須致電setFocusRingType:NSFocusRingTypeNone,檢查控制是否在繪圖方法中具有第一響應者狀態,如果是這樣,繪製一個使用自己的顏色調焦環。

如果您決定使用此方法,請記住對焦環是用戶定義的樣式(藍色或石墨),並且不能保證未來版本的OSX不允許用戶將標準顏色更改爲紅色或綠色。在未來的OSX版本中,也可能會改變對焦環的繪製風格,此時您必須更新繪圖代碼才能看起來正確。

0

我對雨燕2解決方案是


    @IBOutlet weak var textField: NSTextField!

... // === set border to red === // if text field focused right now NSApplication.sharedApplication().mainWindow?.makeFirstResponder(self) // disable following focusing textField.focusRingType = .None // enable layer textField.wantsLayer = true // change border color textField.layer?.borderColor = NSColor.redColor().CGColor // set border width textField.layer?.borderWidth = 1