4

有没有办法在 NSTextField 中强制使用大写字母?

我想创建一个用于输入邮政编码的文本字段,并且我希望输入的所有邮政编码都使用大写字母。

例如 N1 3ET 而不是:n1 3et

另外,我正在使用一个正则表达式,它只接受大写字母(我对正则表达式知之甚少,所以我不热衷于修改它)

谢谢!

迈克尔

4

6 回答 6

7

您可以给 NSTextField 一个委托,其中包含以下内容:

- (void)controlTextDidChange:(NSNotification *)aNotification{
    NSText *fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
    [fieldEditor setString:[[fieldEditor string] uppercaseString]];
}

它应该捕获文本更改通知并将文本大写。

于 2010-01-10T00:29:14.860 回答
2

Anq 的回答效果很好,但是在 Cocoa 世界中,这就是NSFormatter的创建目的。它的工作量大致相同,并且可以轻松移植到项目的任何部分(或任何其他项目)。

另请参阅Cocoa 的数据格式化编程指南

于 2010-01-10T16:54:23.283 回答
2

快速解决方案。作为 NSTextField 委托的类应包含:

override func controlTextDidChange(obj: NSNotification) 
{
    if let info = obj.userInfo, text = info["NSFieldEditor"] as? NSText,
        string = text.string
    {
        text.string = string.uppercaseString
    }
}
于 2015-08-13T23:35:05.463 回答
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
}
于 2014-09-19T20:53:54.400 回答
0

挂钩 NStexfield 以在 IB 中委托比:

- (void)controlTextDidChange:(NSNotification *)aNotification{
  editField = [aNotification object];
  NSString* value = [editField stringValue];
  [editField setStringValue:[value uppercaseString]];
  //NSLog(@"editField%@", editField.stringValue);

}
于 2015-06-03T12:22:12.193 回答
0

我对上述解决方案的问题是,当我对 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];
    }
}

也就是在应用大写之前,先抓取光标的位置,应用大写,然后再把光标放回去。

于 2016-04-07T18:30:10.873 回答