Ios UITextField忽略应更改带有临时重音符号的字符

Ios UITextField忽略应更改带有临时重音符号的字符,ios,swift,uitextfield,user-input,Ios,Swift,Uitextfield,User Input,我试图在iOS应用程序上只允许输入十进制数字字符。我有这段代码,适用于所有情况 override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let allowedCharacters = NSMutableCharacterSet.decimalDigit() let

我试图在iOS应用程序上只允许输入十进制数字字符。我有这段代码,适用于所有情况

override func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let allowedCharacters = NSMutableCharacterSet.decimalDigit()
    let characterSet = CharacterSet(charactersIn: string)
    return allowedCharacters.isSuperset(of: characterSet)
}
这很简单,这是我在网上到处都能找到的答案

然而这就是问题所在:重音字符没有字母。很难解释这种行为。当我写一个字符,如
`
,我会进入一种状态,在这种状态下,我可以使用
e
等字符进行后续操作,从而生成
è
。这是用户输入重音字符的标准方法

我们最终处于这种状态,在这种状态下,
突出显示,我可以使用
o
进行后续操作,然后生成一个
o
。 但是,重音字符(
¨
)字符未触发范围内的
shouldchangeCharacters
调用。似乎iOS决定忽略这个结果,仍然添加角色


如何阻止这种行为?据我所知,这只能通过硬件键盘再现,但我们希望用户使用硬件键盘。

当用户键入组合变音符号(如umlaut)时,根本不会调用您的方法。然后用户键入一些其他字符,如o,您的方法返回
false
。此时,umlaut将被输入到字段中,并显示在
textField.text
中。您需要检测并删除它。

有趣的是,苹果没有为我们提供拦截这种行为的方法。据我所知,我们将在主线程上执行一个调用,以重新验证字符串,删除可能插入的任何无效字符。谢谢你的提示!我假设运行时无法知道,当您键入一个组合字符时,下一个字符将是什么。组合字符加上下一个字符可能组合形成十进制数字字符集中的字符。因此,在我们看到最终的组合是什么之前,它不会做出判断。奇怪的是,返回
false
不会导致自动删除组合字符。