更改NSTextField的边框“发光”颜色

时间:2013-04-18 01:28:50

标签: cocoa colors border nstextfield

我在MainMenu.xib中有一个NSText字段,我有一个操作集来验证它是否为电子邮件地址。我希望NSTexFields边框颜色(蓝色光晕)在我的动作返回NO时为红色,在动作返回YES时为绿色。这是行动:

-(BOOL) validEmail:(NSString*) emailString {
    NSString *regExPattern = @"^[A-Z0-9._%+-]+@[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进行子类化,但是最清楚的方法是非常感谢!

2 个答案:

答案 0 :(得分:1)

我对Swift 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
... // === 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

答案 1 :(得分:0)

解决这个问题的方法是继承NSTextFieldCell并绘制自己的焦点环。据我所知,无法告诉系统使用您自己的颜色绘制聚焦环,因此您必须调用setFocusRingType:NSFocusRingTypeNone,检查控件是否具有第一响应者状态在你的绘图方法中,如果是这样,使用你自己的颜色绘制一个聚焦环。

如果您决定使用此方法,请记住聚焦环是用户定义的样式(蓝色或石墨),并且无法保证OSX的未来版本不会允许用户更改标准颜色为红色或绿色。在未来版本的OSX中,焦点环绘图风格也可能会发生变化,此时您必须更新绘图代码才能使事情看起来正确。