有没有办法在 NSTextField 中强制使用大写字母?
我想创建一个用于输入邮政编码的文本字段,并且我希望输入的所有邮政编码都使用大写字母。
例如 N1 3ET 而不是:n1 3et
另外,我正在使用一个正则表达式,它只接受大写字母(我对正则表达式知之甚少,所以我不热衷于修改它)
谢谢!
迈克尔
有没有办法在 NSTextField 中强制使用大写字母?
我想创建一个用于输入邮政编码的文本字段,并且我希望输入的所有邮政编码都使用大写字母。
例如 N1 3ET 而不是:n1 3et
另外,我正在使用一个正则表达式,它只接受大写字母(我对正则表达式知之甚少,所以我不热衷于修改它)
谢谢!
迈克尔
您可以给 NSTextField 一个委托,其中包含以下内容:
- (void)controlTextDidChange:(NSNotification *)aNotification{
NSText *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
[fieldEditor setString:[[fieldEditor string] uppercaseString]];
}
它应该捕获文本更改通知并将文本大写。
Anq 的回答效果很好,但是在 Cocoa 世界中,这就是NSFormatter的创建目的。它的工作量大致相同,并且可以轻松移植到项目的任何部分(或任何其他项目)。
另请参阅Cocoa 的数据格式化编程指南。
快速解决方案。作为 NSTextField 委托的类应包含:
override func controlTextDidChange(obj: NSNotification)
{
if let info = obj.userInfo, text = info["NSFieldEditor"] as? NSText,
string = text.string
{
text.string = string.uppercaseString
}
}
这是如何在 Swift 中做与 Anq 的回答相同的事情
override func controlTextDidChange(obj: NSNotification!) {
//Make the username all caps to match the PM
var infoDictionary:Dictionary = obj.userInfo! as Dictionary
var text:NSText = infoDictionary["NSFieldEditor"] as NSText;
text.string = text.string.uppercaseString
}
挂钩 NStexfield 以在 IB 中委托比:
- (void)controlTextDidChange:(NSNotification *)aNotification{
editField = [aNotification object];
NSString* value = [editField stringValue];
[editField setStringValue:[value uppercaseString]];
//NSLog(@"editField%@", editField.stringValue);
}
我对上述解决方案的问题是,当我对 UI 中的文本字段进行更改时,光标会移动到字符串的末尾。所以如果我在文本字段中有一个字符串,就像这样
[VCOUVER]
我会将光标放在 1:
[V|COUVER]
并输入小写字母“a”,这会发生:
[真空吸尘器| ]
没有注意到这一点,我会输入“n”并得到:
[真空| ]
废话...好吧,这是我的解决方法:
-(void)controlTextDidChange:(NSNotification *)obj {
if([obj.object isEqualTo:self.locationTextField]) {
NSText *fieldEditor = [[obj userInfo] objectForKey:@"NSFieldEditor"];
NSRange rng = [fieldEditor selectedRange];
[fieldEditor setString:[[fieldEditor string] uppercaseString]];
[fieldEditor setSelectedRange:rng];
}
}
也就是在应用大写之前,先抓取光标的位置,应用大写,然后再把光标放回去。