【问题标题】:How to get NSNumberFormatter to allow hyphens?如何让 NSNumberFormatter 允许使用连字符?
【发布时间】:2015-09-16 00:31:33
【问题描述】:

我有一个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
    }

}

【问题讨论】:

  • 如果我有相关的代码可以发布,我可能会有答案。为 NSTextField 及其 NSNumberFormatter 发布 XML 标记是没有意义的:它们都是通过 XCode 的界面构建器配置的。
  • 您可以发布界面生成器的屏幕截图。
  • 首先,准确描述您是如何添加数字格式化程序的。其次描述(或显示)all 的数字格式化程序属性设置。最后,您所说的“它不会让我输入连字符”是什么意思?当你尝试时究竟会发生什么?哔?警告对话框?没有?顺便说一句,我假设当您说“连字符”时,您的意思是键盘上的标准连字符减号键。在 Unicode 中,“连字符”表示不同的意思。
  • 这就是我所做的:从对象库中拖动一个“带有数字格式化程序的文本字段”,将其放到一个视图中,在 MainMenu 的文档大纲中展开文本字段 > 文本字段单元格 > 数字格式化程序。 xib,在属性检查器中将最小值设置为“-1,000”。我意识到文字处理器将连字符变成的键与上面带有下划线的键之间存在差异:我说的是连字符/破折号表示减号。它不会让我输入那个字符。
  • 你所描述的对我来说很好。

标签: swift cocoa nstextfield nsnumberformatter nsformatter


【解决方案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

【讨论】:

  • 顺便说一句,这可能只有在 controlTextDidChange: 处理程序内的文本字段上调用 ​​floatValue 时才需要。如果你不这样做,标准的 NSNumberFormatter 应该可以工作。
【解决方案2】:

子类NSNumberFormatter并实现这个方法:

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

返回YES,以防您的输入是您想要的有效数字/字符。

【讨论】:

  • 感谢您的建议。我创建了一个子类并将其设置为 Identity Inspector 中相关数字格式化程序的自定义类。我只是在任何时候都返回“true”(Swift),它仍然不允许我输入减号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2020-10-15
相关资源
最近更新 更多