【问题标题】:More specific NSNumberFormatter failure behaviour更具体的 NSNumberFormatter 失败行为
【发布时间】:2010-04-26 21:02:20
【问题描述】:

我有一个NSTextField,我需要用户在其中输入一个介于最大值和最小值之间的数字,如果我能检测到 NSNumberFormatter 何时未能通过该特定测试,那就太好了,这样我就可以显示一个更好的消息(“数字太大”不是很有帮助,它需要显示有效范围)或简单地将字段自动设置为最接近的有效值。

我查看了NSTextField 委托的‑control:didFailToFormatString:errorDescription: 方法,该方法似乎不允许您修改错误,并且我查看了覆盖NSNumberFormatter‑getObjectValue:forString:range:error: 方法,它确实给出了我可以修改 NSError,但似乎没有任何方法可以确定返回了哪个特定错误。

由于我只是输入一个简单的整数,我不需要NSNumberFormatter 中的大部分功能,我最好从头开始编写自己的格式化程序吗?

【问题讨论】:

    标签: objective-c cocoa macos validation nsnumberformatter


    【解决方案1】:

    有一种方法可以确定在 NSError 中返回哪个错误。 NSError error codes documentation 定义了最大和最小验证失败的错误。只需将-code 发送到您的 NSError 对象即可。

    【讨论】:

    • 谢谢,但是 NSFormattingErrorMinimum/Maximum 只是意味着这些是格式化错误代码的开始和结束。无论看起来是什么格式错误,返回的错误代码都是 2048。
    【解决方案2】:

    我建议不要在NSNumberFormatter 中强制执行这些限制,而是在textDidChange: 上发生的逻辑中强制执行这些限制。根据您的描述,您听起来可能正在使用界面生成器来连接您的数字格式化程序。相反,我会让您的控制器成为特定文本字段的NSTextFieldDelegate。然后,您可以直接处理与数字格式化程序的交互,并且可以适当地设置特定错误标签的文本。此外,这允许您提供更复杂的依赖于上下文的后备值。又名:在某些情况下,您可能总是希望数字回落到中间范围,或者回落到低端,或者回落到较旧的值,或者用户跑过的任何边缘。这还可以让您强制执行中断范围,或将特别长的小数强制转换为整洁的特定精度。

    【讨论】:

      猜你喜欢
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多