有没有办法在NSTextField中强制使用大写字母?
我想创建一个用于在邮政编码中输入的文本字段,我希望输入的所有邮政编码都使用大写字母。
e.g。 N1 3ET代替:n1 3et
另外,我使用的是正则表达式,它只接受大写字母(我对正则表达式知之甚少,所以我不热衷于修改它)
谢谢!
迈克尔
答案 0 :(得分:6)
你可以给NSTextField一个delegate,其中包含以下内容:
- (void)controlTextDidChange:(NSNotification *)aNotification{
NSText *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
[fieldEditor setString:[[fieldEditor string] uppercaseString]];
}
它应该捕获文本更改通知并将文本大写。
答案 1 :(得分:2)
Anq的答案效果很好,但在Cocoa世界中,这就是为NSFormatter创建的。它的工作量大致相同,可以轻松移植到项目的任何部分(或任何其他项目)。
答案 2 :(得分:2)
快速解决方案。作为NSTextField委托的类应包含:
torrent
答案 3 :(得分:0)
以下是如何在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
}
答案 4 :(得分:0)
Hook NStexfield在IB中委派代表:
- (void)controlTextDidChange:(NSNotification *)aNotification{
editField = [aNotification object];
NSString* value = [editField stringValue];
[editField setStringValue:[value uppercaseString]];
//NSLog(@"editField%@", editField.stringValue);
}
答案 5 :(得分:0)
我对上述解决方案的问题是,当我对UI中的文本字段进行更改时,光标将移动到字符串的末尾。所以如果我在文本字段中有一个字符串,就像这个
[VCOUVER]
我将光标放在1:
[V | COUVER]
并输入小写字母' a',会发生这种情况:
[VACOUVER | ]
没有注意到这一点,我会输入' n'得到:
[VACOUVERN | ]
废话......好的,这是我的修复:-(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];
}
}
也就是说,在应用大写之前,抓住光标的位置,应用大写,然后将光标放回去。