ben*_*9a4 8 cocoa border colors 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;
}
Run Code Online (Sandbox Code Playgroud)
我现在调用这个函数并设置文本颜色,但我想改为设置 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];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我对子类化 NSTextField 持开放态度,但最简洁的方法将不胜感激!
我对 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
Run Code Online (Sandbox Code Playgroud)
解决这个问题的方法是子类化NSTextFieldCell并绘制你自己的聚焦环。据我所知,无法告诉系统使用您自己的颜色绘制聚焦环,因此您必须调用setFocusRingType:NSFocusRingTypeNone,检查控件在您的绘制方法中是否具有第一响应者状态,如果是,则绘制焦点戒指使用您自己的颜色。
如果您决定使用此方法,请记住对焦环是用户定义的样式(蓝色或石墨),并且不能保证 OSX 的未来版本不会允许用户将标准颜色更改为红色或绿色。在 OSX 的未来版本中,聚焦环绘制样式也可能会发生变化,此时您必须更新绘制代码才能使事情看起来正确。