强制所有大写字母在NSTextField(Cocoa)

时间:2010-01-09 23:42:57

标签: cocoa nstextfield capitalization

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

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

e.g。 N1 3ET代替:n1 3et

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

谢谢!

迈克尔

6 个答案:

答案 0 :(得分:6)

你可以给NSTextField一个delegate,其中包含以下内容:

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

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

答案 1 :(得分:2)

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

另请参阅Data Formatting Programming Guide For Cocoa

答案 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];
    }
}

也就是说,在应用大写之前,抓住光标的位置,应用大写,然后将光标放回去。

相关问题