2013-04-18 97 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