UITextField 忽略带有临时重音的 shouldChangeCharactersIn

UITextField ignoring shouldChangeCharactersIn with temporary accents

我试图在 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)
}

这很简单,这是我在 SO 上随处找到的答案。

但是,这就是问题所在:没有字母的重音字符。很难解释这种行为。当我写 ¨` 之类的字符时,我会进入一种状态,我可以跟进 e 之类的字符以得到 è。这是用户输入重音字符的一种非常标准的方式。

我们最终处于这种状态,其中 ¨ 被突出显示,我可以跟进 o,然后生成 ö 但是,重音字符 (¨) 字符没有触发 shouldChangeCharactersIn range 调用。似乎 iOS 决定忽略该结果并仍然添加字符。

我怎样才能阻止这种行为?据我了解,这只能通过硬件键盘重现,但我们希望我们的用户使用一个。

当用户键入变音符号等组合变音符号时,根本不会调用您的方法。然后用户键入一些其他字符,例如 o,以及您的方法 returns false。届时,元音变音将被输入字段并显示在 textField.text 中。您需要检测并删除它。