改变NSTextField边框“发光”颜色

8

我在MainMenu.xib中有一个NSTextField,并设置了一个动作来验证它是否为电子邮件地址。当我的动作返回NO时,我希望NSTextField的边框颜色(那个蓝色发光)变成红色,当该动作返回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的子类,但是最好的做法会更加受欢迎!


你解决了这个问题吗?我也在寻找同样的东西。我不知道在Cocoa中是否有一种标准的方法来指示无效字段。 - Rob N
2个回答

6

我的解决方案是针对Swift 2的


    @IBOutlet weak var textField: NSTextField!

// === 将边框设置为红色 === // 如果文本字段当前处于焦点状态 NSApplication.sharedApplication().mainWindow?.makeFirstResponder(self) // 禁用后续的聚焦操作 textField.focusRingType = .None // 启用图层 textField.wantsLayer = true // 更改边框颜色 textField.layer?.borderColor = NSColor.redColor().CGColor // 设置边框宽度 textField.layer?.borderWidth = 1

0

处理这个问题的方法是子类化NSTextFieldCell并绘制自己的焦点环。据我所知,没有办法告诉系统使用您自己的颜色绘制焦点环,因此您将不得不调用setFocusRingType:NSFocusRingTypeNone,在绘图方法中检查控件是否具有第一响应者状态,如果是,则使用自己的颜色绘制焦点环。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接