28

NSTextField数値/整数のみを許可するようにを制限するにはどうすればよいですか?このような質問を見つけましたが、役に立ちませんでした。

4

9 に答える 9

50

独自の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];
于 2012-08-30T05:17:26.543 に答える
28

Swift3バージョン

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

使用する:

let onlyIntFormatter = OnlyIntegerValueFormatter()
myNsTextField.formatter = onlyIntFormatter
于 2016-10-08T17:17:42.007 に答える
9

これがフィルタリングの解決策です。テキストフィールドへのデリゲートとアウトレットを指定し、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);
}
于 2013-03-20T19:35:01.553 に答える
8

これを試して -

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[textField setFormatter:formatter];
于 2012-08-28T14:42:10.470 に答える
4

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
}
于 2015-03-16T11:01:08.057 に答える
4

SWIFTでは、このようにします

  1. Int()を使用してテキスト値をIntに変換します
  2. 変換された値が0以上であることを確認してください
  3. 0未満の場合、エラーメッセージを表示します。その他は値を受け入れます

    if ((Int(txtField.stringValue)) < 0){
        // Display error message
    }
    
于 2016-01-22T21:19:10.637 に答える
2

[Swift3.0.1で動作します]

他の人が示唆したように、サブクラスNumberFormatterとオーバーライドisPartialStringValidメソッド。最も簡単な方法は、NumberFormatterオブジェクトNSTextFieldをxib / storyboardの下にドロップして、それを更新することCustom Classです。次の実装では、整数または空白の値のみが許可され、文字列に不正な文字が含まれている場合はビープ音が鳴ります。

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

StringとはnumberOfCharacters()isInt()拡張機能に追加されたメソッドです。

extension String {

    func isInt() -> Bool {

        if let intValue = Int(self) {

            if intValue >= 0 {
                return true
            }
        }

        return false
    }

    func numberOfCharacters() -> Int {
        return self.characters.count
    }
}
于 2017-01-18T10:45:54.953 に答える
1

同じものを作成する手順は次のとおりです。

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

完了しました!!!

于 2014-03-07T15:09:48.410 に答える
1

空のスペースの代わりに0を使用したSwift2.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
        }
    }
}
于 2016-03-16T09:12:40.880 に答える