将NSTextField限制为仅允许数字

Jom*_*nJi 21 cocoa nstextfield

如何限制a NSTextfield仅允许数字/整数?我发现了这样的问题,但他们没有帮助!

Dmi*_*try 44

尝试创建自己的NSNumberFormatter子类并检查-isPartialStringValid:newEditingString:errorDescription:方法中的输入值.

@interface OnlyIntegerValueFormatter : NSNumberFormatter

@end

@implementation OnlyIntegerValueFormatter

- (BOOL)isPartialStringValid:(NSString*)partialString newEditingString:(NSString**)newString errorDescription:(NSString**)error
{
    if([partialString length] == 0) {
        return YES;
    }

    NSScanner* scanner = [NSScanner scannerWithString:partialString];

    if(!([scanner scanInt:0] && [scanner isAtEnd])) {
        NSBeep();
        return NO;
    }

    return YES;
}

@end
Run Code Online (Sandbox Code Playgroud)

然后将此格式化程序设置为NSTextField:

OnlyIntegerValueFormatter *formatter = [[[OnlyIntegerValueFormatter alloc] init] autorelease];
[textField setFormatter:formatter];
Run Code Online (Sandbox Code Playgroud)

  • 在Interface Builder中,将NSObject拖放到xib上并将其类设置为自定义格式化程序(如上所述).然后将NSTextFields"formatter"插座设置/拖动到该NSObject.然后,您不需要任何代码来应用格式化程序. (6认同)

Xav*_*eau 16

Swift 3版

import Foundation

    class OnlyIntegerValueFormatter: NumberFormatter {

    override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {

        // Ability to reset your field (otherwise you can't delete the content)
        // You can check if the field is empty later
        if partialString.isEmpty {
            return true
        }

        // Optional: limit input length
        /*
        if partialString.characters.count>3 {
            return false
        }
        */

        // Actual check
        return Int(partialString) != nil
    }
}
Run Code Online (Sandbox Code Playgroud)

使用:

let onlyIntFormatter = OnlyIntegerValueFormatter()
myNsTextField.formatter = onlyIntFormatter
Run Code Online (Sandbox Code Playgroud)


小智 8

试试这个 -

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[textField setFormatter:formatter];
Run Code Online (Sandbox Code Playgroud)


Luc*_*ier 8

这是一个带过滤的解决方案.给textfield的委托和出口并设置controlTextDidChange方法.

- (void)controlTextDidChange:(NSNotification *)aNotification {

    NSTextField *textfield = [notification object];
    NSCharacterSet *charSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

    char *stringResult = malloc([textfield.stringValue length]);
    int cpt=0;
    for (int i = 0; i < [textfield.stringValue length]; i++) {
        unichar c = [textfield.stringValue characterAtIndex:i];
        if ([charSet characterIsMember:c]) {
            stringResult[cpt]=c;
            cpt++;
        }
    }
    stringResult[cpt]='\0';
    textfield.stringValue = [NSString stringWithUTF8String:stringResult];
    free(stringResult);
}
Run Code Online (Sandbox Code Playgroud)