Cocoa 限制NSTextField仅允许数字

Cocoa 限制NSTextField仅允许数字,cocoa,nstextfield,Cocoa,Nstextfield,如何限制NSTextfield仅允许数字/整数?我发现了像这样的问题,但没有帮助 试试这个- NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; [textField setFormatter:formatter]; 尝试创建自己的NSNumberFormatter子类,并检

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

试试这个-

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[textField setFormatter:formatter];

尝试创建自己的
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
然后将此格式化程序设置为
NSTextField

OnlyIntegerValueFormatter *formatter = [[[OnlyIntegerValueFormatter alloc] init] autorelease];
[textField setFormatter:formatter];

这里有一个过滤的解决方案。为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);
}
-(void)controlTextDidChange:(NSNotification*)通知{
NSTextField*textfield=[通知对象];
NSCharacterSet*charSet=[NSCharacterSet characterSetWithCharactersInString:@“0123456789”];
char*stringResult=malloc([textfield.stringValue-length]);
int-cpt=0;
对于(int i=0;i<[textfield.stringValue-length];i++){
unichar c=[textfield.stringValue characterAtIndex:i];
如果([字符集成员:c]){
stringResult[cpt]=c;
cpt++;
}
}
stringResult[cpt]='\0';
textfield.stringValue=[NSString stringWithUTF8String:stringResult];
免费(结果);
}

以下是创建相同的

只需通过对NSNumberFormatter进行子分类来创建ANYCLASS(称为SAMPLE)

在.m文件中编写以下代码

 - (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] ;
}

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;
}

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

NSTextField *mySampleTxtFld;
对于此设置,格式化程序

SAMPLE* formatter=[[SAMPLE alloc]init];// create SAMPLE FORMATTER OBJECT 

self.mySampleTxtFld.delegate=self;
[self.mySampleTxtFld setFormatter:formatter];

你的任务完成了

以下是Swift版本:

override func isPartialStringValid(partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {
    if (count(partialString.utf16)) {
        return true
    }

    if (partialString.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet) != nil) {
        NSBeep()
        return false
    }

    return true
}
重写函数isPartialString有效(partialString:String,newEditingString:newString:AutoreleasingUnsafemtablePointer,errorDescription error:AutoreleasingUnsafemtablePointer)->Bool{
if(计数(部分字符串utf16)){
返回真值
}
if(partialString.rangeOfCharacterFromSet(NSCharacterSet.decimalDigitCharacterSet().InversedSet)!=nil){
NSBeep()
返回错误
}
返回真值
}

在SWIFT中,我是这样做的

  • 使用Int()将文本值转换为Int
  • 检查转换后的值是否不小于0
  • 如果小于0,则显示错误消息“其他接受值”

    if ((Int(txtField.stringValue)) < 0){
        // Display error message
    }
    
    if((Int(txtField.stringValue))<0){
    //显示错误消息
    }
    

  • Swift 2.0自定义格式设置程序,使用0代替空白:

    class OnlyIntegerValueFormatter: NSNumberFormatter {
    
        override func isPartialStringValid(partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {
    
            if partialString.isEmpty {
                newString.memory = "0"
                return false
            }
    
            if Int(partialString) < 0 {
                NSBeep()
                return false
            } else {
                return true
            }
        }
    }
    
    仅类IntegerValueFormatter:NSNumberFormatter{
    重写函数IsPartialString有效(partialString:String,newEditingString新闻字符串:AutoreleasingUnsafemtablePointer,errorDescription错误:AutoreleasingUnsafemtablePointer)->Bool{
    如果partialString.isEmpty{
    newString.memory=“0”
    返回错误
    }
    如果Int(partialString)<0{
    NSBeep()
    返回错误
    }否则{
    返回真值
    }
    }
    }
    
    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
        }
    }
    

    [适用于Swift 3.0.1]

    正如其他人所建议的,子类
    NumberFormatter
    和重写
    isPartialStringValid
    方法。最简单的方法是将
    NumberFormatter
    对象放到xib/storyboard中的
    NSTextField
    下,并更新其
    自定义类。
    下一个实现只允许整数或空值,如果字符串包含非法字符,则会播放嘟嘟声

    class IntegerFormatter: NumberFormatter {
    
        override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
    
            // Allow blank value
            if partialString.numberOfCharacters() == 0  {
                return true
            }
    
            // Validate string if it's an int
            if partialString.isInt() {
                return true
            } else {
                NSBeep()
                return false
            }
        }
    }
    

    @giorashc谢谢你,我找到了,但是没有帮助:(你需要说明为什么你找到的其他问题没有帮助。哦,对不起,W'RKNCANCENTER,我不知道把代码放在哪里,答案不清楚……(至少对我来说)谢谢你的回答,但出于某种原因,它仍然不允许只使用数字:(但我会继续尝试……顺便说一句,代码应该也在哪里?在Interface Builder中,将一个NSObject放到xib上,并将其类设置为自定义格式化程序(如上所述)。然后设置/拖动NSTextFields“formatter”出口到该NSObject。然后你不需要任何代码来应用格式化程序。它工作正常…但当我尝试输入多个零(0)…例如000000…它不接受…任何帮助请?
    string。utf16Count
    在swift 1.2中不再可用。你应该将其更改为
    count(partialString.utf16)
    。实际上,这在很多层面上都是错误的。首先,数字不是布尔可转换的,其次,您需要检查
    isEmpty
    。如果字符串的长度大于零,则必须彻底检查。使用了一点逻辑!
    class IntegerFormatter: NumberFormatter {
    
        override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
    
            // Allow blank value
            if partialString.numberOfCharacters() == 0  {
                return true
            }
    
            // Validate string if it's an int
            if partialString.isInt() {
                return true
            } else {
                NSBeep()
                return false
            }
        }
    }
    
    extension String {
    
        func isInt() -> Bool {
    
            if let intValue = Int(self) {
    
                if intValue >= 0 {
                    return true
                }
            }
    
            return false
        }
    
        func numberOfCharacters() -> Int {
            return self.characters.count
        }
    }