如何强制NSTextField只允许数字?

时间:2012-11-21 18:06:45

标签: objective-c cocoa interface-builder nstextfield nsnumberformatter

在Interface Builder中,我创建了一个文本字段,并将NSNumberFormatter粘贴到单元格中。但是,用户仍然可以在文本字段中键入文本。有没有办法仅使用界面构建器将输入限制为数字?我认为这是NSNumberFormatter的重点。

2 个答案:

答案 0 :(得分:0)

每个格式化程序都有这种方法:

- (BOOL) getObjectValue: (id*) object forString: (NSString*) string 
    errorDescription: (NSError**) error;

这对每个格式化程序都有效 如果字符串无效,则返回false,并且作为参数(解除引用)传递的对象将为nil 因此,不要将数字格式化程序放到文本字段中,而是使用您自己的格式化程序作为实例变量。请注意实现委托协议的文本字段,以便在每次更改文本时都可以通知您。 然后调用此方法:

NSNumber* number;
BOOL success=[formatter getObjectValue: &number forString: [myTextField stringValue] errorDescription:nil];

此时如果成功为假(或检查数字是否为nil),则文本字段中存在无效字符串,因此更适合您的操作(可能删除整个字符串,或将0.0显示为值)。

还有另一种方法:

- (BOOL) isPartialStringValid : (NSString*) partialString: (NSString*) partialString
    errorDescription: (NSString*) error;

通过这种方式,您可以知道部分字符串是否有效。例如,科学记数法“1e”无效,但部分有效,因为用户可以添加1并且它将变为“1e1”。

答案 1 :(得分:0)

创建一个NSNumberFormatter子类并将其放入实现中。在您的代码中,将YKKNumberFormatter设置为NSTextField / UITextField的格式化程序。

@implementation YKKNumberFormatter

- (BOOL)isPartialStringValid:(NSString *)partialString newEditingString:(NSString **)newString errorDescription:(NSString **)error {
    // Make sure we clear newString and error to ensure old values aren't being used
    if (newString) { *newString = nil;}
    if (error) {*error = nil;}

    static NSCharacterSet *nonDecimalCharacters = nil;
    if (nonDecimalCharacters == nil) {
        nonDecimalCharacters = [[[NSCharacterSet decimalDigitCharacterSet] invertedSet] retain];
    }

    if ([partialString length] == 0) {
        return YES; // The empty string is okay (the user might just be deleting everything and starting over)
    } else if ([partialString rangeOfCharacterFromSet:nonDecimalCharacters].location != NSNotFound) {
        return NO; // Non-decimal characters aren't cool!
    }

    return YES;
}

@end