将NSTextField输入限制为仅限数字?NSNumberformatter

Mon*_*lue 8 macos cocoa objective-c nstextfield

我刚刚开始使用Mac App Development,到目前为止一切都很好,我只是在尝试让NSTextField只接受输入数字时遇到问题.

到目前为止,我已经添加了一个格式化到的NSTextField,并将其设置为仅允许小数现在,当我在字段中输入字母它仍然允许我,但不允许做时,我点击出细胞.

理想情况下,我希望应用程序不要让用户键入任何字母,只是发出哔哔声或什么也不做.

任何关于此的提示或指示都会很棒

Mik*_*lah 8

子类NSNumberFormatter并实现此方法:

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString *)origString
       originalSelectedRange:(NSRange)origSelRange
            errorDescription:(NSString **)error
Run Code Online (Sandbox Code Playgroud)

  • @FlankPlank 你能告诉我们更多关于你的解决方案吗? (2认同)

VSN*_*VSN 5

以下是创建相同内容的步骤:

\n\n

只需创建 NSNumberFormatter 子类的 ANYCLASS(称为 SAMPLE),然后在 .m 文件中编写以下代码...

\n\n
-(BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **) error {\n    // Make sure we clear newString and error to ensure old values aren't being used\n    if (newString) { *newString = nil;}\n    if (error)     {*error = nil;}\n\n    static NSCharacterSet *nonDecimalCharacters = nil;\n    if (nonDecimalCharacters == nil) {\n        nonDecimalCharacters = [[NSCharacterSet decimalDigitCharacterSet] invertedSet] ;\n    }\n\n    if ([partialString length] == 0) {\n        return YES; // The empty string is okay (the user might just be deleting everything and starting over)\n    } else if ([partialString rangeOfCharacterFromSet:nonDecimalCharacters].location != NSNotFound) {\n        return NO; // Non-decimal characters aren't cool!\n    }\n\n    return YES;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在在您的实际类中将格式化程序设置为您的 NSTextField 对象,如下所示:

\n\n
NSTextField *mySampleTxtFld;\n
Run Code Online (Sandbox Code Playgroud)\n\n

为此设置格式化程序:

\n\n
SAMPLE* formatter=[[SAMPLE alloc]init]; // create SAMPLE FORMATTER OBJECT \n\nself.mySampleTxtFld.delegate=self;\n[self.mySampleTxtFld setFormatter:formatter];\n
Run Code Online (Sandbox Code Playgroud)\n\n

你\xe2\x80\x99就完成了!

\n