我有NSTextField
NSNumberFormatter
来限制数字输入,但不允许我输入连字符输入负数(即使在设置"最小值&#34之后) ;到" -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
}
}
答案 0 :(得分:0)
我知道这个问题很老,但我(我认为)能够使用 Nishant 的答案作为灵感来真正解决这个问题。我的解决方案如下。我覆盖了三种方法。这三个覆盖的原因如下:
使它成为一个单独的减号将被视为值 0。
如果用户字符串当前包含一个单独的减号,则将该减号作为字符串值而不是 0 返回。
使它能够接受一个单独的减号作为输入字符串。 (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
答案 1 :(得分:-1)
子类NSNumberFormatter
并实现此方法:
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error
如果您的输入是您想要的有效数字/字符,请返回YES
。