阻止其他类型的键盘

Blocking other type keyboards

我有一个文本字段,检查是在 shouldChangeCharactersIn 函数中完成的。 这在大多数情况下都运行良好。

首先我有一个允许字符的字符集:

// Check characters
allowedCharacters = CharacterSet.decimalDigits.union(.letters)
allowedCharacters = allowedCharacters?.union(CharacterSet(charactersIn: "àÀáÁâÂãÃäÄåāÅæèÈéÉêÊëËìÌíÍîÎïÏòÒóÓöÖôÔõÕøØùÙúÚûÛüÜýÝÿçÇñÑ"))
allowedCharacters = allowedCharacters?.union(CharacterSet(charactersIn: " ,.:;@#%*+&_=<>!?\r\n'(){}[]/-"))

allowedCharacters 变量现在包含我希望在我的应用程序中允许的所有字符。 trimminCharacters 删除所有不在允许集中的字符。

guard string.trimmingCharacters(in: allowedCharacters!) == "" else { return false }

这似乎工作正常,但是当用户将键盘切换为土耳其语或中文时,可能会输入上面列表中没有的字符。 例如。来自土耳其语键盘:ğ 和 ş 而来自中文键盘:ㄎㄕ和ㄨ

我想阻止所有不在允许的 CharacterSet 中的字符。如何防止用户输入这些字符?

letters 字符集包括类别以“L”或“M”开头的每个 unicode 标量。

嗯,ğ和ş都属于Ll(小写字母)类别,而Bopomofo符号ㄎㄕ和ㄨ都属于Lo(其他字母)类别。所有这些字符都在 letter 字符集中!

请注意,decimalDigits 也是如此,它包括 Nd 类别中的所有内容。例如,这包括印度阿拉伯数字 ٠١٢٣٤٥٦٧٨٩。

您似乎想要允许一组相当具体的字符,所以您应该明确地写出来:

CharacterSet(charactersIn: "a"..."z") // assuming these chars are what you want
    .union(.init(charactersIn: "A"..."Z"))
    .union(.init(charactersIn: "0"..."9"))
    .union(.init(charactersIn: "àÀáÁâÂãÃäÄåāÅæèÈéÉêÊëËìÌíÍîÎïÏòÒóÓöÖôÔõÕøØùÙúÚûÛüÜýÝÿçÇñÑ"))
    .union(.init(charactersIn: " ,.:;@#%*+&_=<>!?\r\n'(){}[]/-"))