0

我有一个NSTextField限制NSNumberFormatter输入数字的方法,但它不允许我输入连字符来输入负数(即使在将“最小值”设置为“-1,000”之后)。

我可以将“ -1 ”复制/粘贴到字段中并以编程方式设置其值,但用户不能输入连字符。

有没有办法允许这样做?

谢谢。

PS,这是我尝试的自定义格式化程序(没有成功),根据 Nishant 的建议如下:

import Cocoa

class CustomNumberFormatter: NSNumberFormatter {

    override func isPartialStringValid(partialStringPtr: AutoreleasingUnsafeMutablePointer<NSString?>,
        proposedSelectedRange proposedSelRangePtr: NSRangePointer, originalString origString: String,
        originalSelectedRange origSelRange: NSRange, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>) -> Bool {

            return true
    }

}
4

2 回答 2

1

我知道这个问题很老,但我(我认为)能够使用 Nishant 的回答作为灵感来真正解决这个问题。我的解决方案如下。我覆盖了三种方法。这三个覆盖的原因如下:

  1. 使它成为一个单独的减号将被视为 0 的值。

  2. 使如果用户字符串当前包含一个单独的减号,则将该减号作为字符串值返回,而不是 0。

  3. 让它接受一个单独的减号作为输入字符串。(Nishant 最初提出的解决方案。)

NumberFormatterFix.h:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NumberFormatterFix : NSNumberFormatter
{
    BOOL minusSign;
}

- (BOOL)getObjectValue:(out id _Nullable * _Nullable)obj forString:(NSString *)string errorDescription:(out NSString * _Nullable * _Nullable)error;
- (nullable NSString *)stringForObjectValue:(nullable id)obj;
- (BOOL)isPartialStringValid:(NSString * _Nonnull * _Nonnull)partialStringPtr proposedSelectedRange:(nullable NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString * _Nullable * _Nullable)error;

@end


NS_ASSUME_NONNULL_END

NumberFormatterFix.m:

#import "NumberFormatterFix.h"

@implementation NumberFormatterFix

- (BOOL)getObjectValue:(out id _Nullable * _Nullable)obj forString:(NSString *)string errorDescription:(out NSString * _Nullable * _Nullable)error
{
    if ([string isEqualToString:@"-"])
    {
        minusSign = YES;
        *obj = [NSNumber numberWithDouble:0.0];
        return YES;
    }
    minusSign = NO;
    return [super getObjectValue:obj forString:string errorDescription:error];
}

- (nullable NSString *)stringForObjectValue:(nullable id)obj
{
    if (minusSign)
    {
        return @"-";
    }
    return [super stringForObjectValue:obj];
}

- (BOOL)isPartialStringValid:(NSString * _Nonnull * _Nonnull)partialStringPtr proposedSelectedRange:(nullable NSRangePointer)proposedSelRangePtr originalString:(NSString *)origString originalSelectedRange:(NSRange)origSelRange errorDescription:(NSString * _Nullable * _Nullable)error
{
    if ([*partialStringPtr isEqualToString:@"-"])
    {
        return YES;
    }
    return [super isPartialStringValid:partialStringPtr proposedSelectedRange:proposedSelRangePtr originalString:origString originalSelectedRange:origSelRange errorDescription:error];
}

@end
于 2021-05-15T23:17:29.060 回答
-1

子类化NSNumberFormatter并实现此方法:

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
              originalString:(NSString *)origString
       originalSelectedRange:(NSRange)origSelRange
            errorDescription:(NSString **)error

YES如果您的输入是您想要的有效数字/字符,则返回。

于 2015-09-16T10:36:09.947 回答