Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:如何使用这两种方法&引用;及&引用;作为十进制分隔符,或者至少动态地将一个分隔符转换为另一个分隔符_Objective C_Cocoa_Interface Builder - Fatal编程技术网

Objective c 目标C:如何使用这两种方法&引用;及&引用;作为十进制分隔符,或者至少动态地将一个分隔符转换为另一个分隔符

Objective c 目标C:如何使用这两种方法&引用;及&引用;作为十进制分隔符,或者至少动态地将一个分隔符转换为另一个分隔符,objective-c,cocoa,interface-builder,Objective C,Cocoa,Interface Builder,我有一个NSTextField的实例,例如someTextField,我将使用数字格式化程序将输入限制为仅数字 问题在于本地化与使用的特定键盘布局相结合 我想让美国和欧洲的用户都可以输入他们本地化的十进制分隔符。大家都知道,在美国,这将是,,而在欧洲的大部分地区,这将是,(与千位分隔符类似,等等,但现在让我们把它放在一边) 因此,我编写了以下任务: [numberFormatter setLocale:[NSLocale currentLocale]]用于NSNumberFormatter的实例

我有一个
NSTextField
的实例,例如
someTextField
,我将使用数字格式化程序将输入限制为仅数字

问题在于本地化与使用的特定键盘布局相结合

我想让美国和欧洲的用户都可以输入他们本地化的十进制分隔符。大家都知道,在美国,这将是
,而在欧洲的大部分地区,这将是
(与千位分隔符类似,等等,但现在让我们把它放在一边)

因此,我编写了以下任务:
[numberFormatter setLocale:[NSLocale currentLocale]]用于
NSNumberFormatter
的实例

当用户将
设置为十进制分隔符并打开美国键盘布局(在欧洲相当常见)时,按下数字键盘上的十进制分隔键,就会出现问题。在打开US键盘布局的情况下,这将使他使用
作为十进制分隔符,但同时由于系统范围内的本地化设置,它将在
someTextField
中被忽略。因此,如果您只想使用数字键盘键入
1/2
,您需要在文本字段中键入
0.5
(美国键盘布局),系统会将其读取为
0
,因为它只识别
作为十进制分隔符。这就是该计划目前的运作方式,我希望在这方面加以改进

我希望允许用户在
someTextField
中键入
,并让系统将其识别为十进制分隔符,就像它将
一样。这种行为可以在苹果自己的计算器应用程序中看到。如果在数字键盘上键入
,屏幕上将立即显示为
(对于前面描述的所有情况)

问题是:我是否可以使用
NSNumberFormatter
的实例来实现这一点?如果没有,是否可以将数字键盘十进制分隔符键输出动态转换为系统范围内的十进制分隔符设置?或者你有其他的建议


谢谢。

我对你的问题没有具体的答案,但我想说的是,正确的方法是根本不要乱动NSNumberFormatter,而是集中精力尝试更改键盘生成的字符

数字格式化程序的默认区域设置通常是用户在国际化设置中设置的系统默认区域设置。如果以编程方式更改UI元素的行为,则实际上是在告诉用户“我比你更了解如何输入数字”。开发人员那种傲慢的态度永远不会让他们在UI设计方面取得好成绩

事实上,您可以应用相同的参数来重新映射数字键盘上的点按钮。你怎么知道用户没有设置我们的键盘布局,因为它允许他们从那个键上得到一个点?也许他们认为能够从键盘键入数千个分隔符比小数点分隔符更重要。我并不是说你不应该实现你的功能,只是要确保用户可以控制它何时被启用或禁用


无论如何,您可能希望覆盖控件上的事件。更多信息。

查看UITextFieldDelegate协议。它允许您的textfield询问其代理是否应接受用户刚刚键入的字符。合适的方法应该是textField:shouldChangeCharactersRange:replacementString。如果所讨论的角色是,或。只需让代理“手动”附加正确本地化的十进制分隔符并返回NO


如果文本字段设置为数字模式,我不确定这是否有效,可能是在调用委托方法之前过滤了输入-如果之前过滤掉了“错误”的分隔符,则不会调用该方法。如果是这样,您可能需要考虑将文本字段保留为字母数字模式,并再次使用委托方法筛选出不是数字或分隔符的任何内容。但是,在这种情况下,您应该确保不允许用户键入超过一个小数点分隔符-忽略多余的小数点分隔符或删除第一个小数点分隔符并接受新的小数点分隔符。

感谢您的回复和链接。我绝对无意将我的做事方式强加给用户。相反,我只是想减少他们的努力。我提到了苹果的计算器——我的许多同事(我也是)都很喜欢用手在数字键盘上输入十进制数字,而不是用手按
键,或者更糟糕的是,切换布局。不过,我必须检查一下苹果计算器关于千个分隔符的行为,因为我确实认为你的观点是正确的。这个问题是关于macOS上的AppKit编程,而不是关于iOS上的UIKit编程。AppKit没有直接等效的
文本字段:shouldChangeCharactersRange:replacementString: