微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使 UITextfield 只接受片假名字符 - swift

如何解决使 UITextfield 只接受片假名字符 - swift

我希望我的 UITextField 只接受一个字符,它应该是一个片假名字符。当用户使用 Japanese-Romaji 拼音键盘打字时,我该怎么做?

General->Keyboard->Keyboards-> Japanese Romaji

以下代码不起作用,因为我将英文字符输入到 string 参数中。似乎我必须处理 textFiled 的 markedTextRange 属性,但不确定如何处理。知道如何修改以下方法以满足我的要求吗?

当语言为表意且键盘为拼音时,需要多级文本输入。

    func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool {
        if string.rangeOfCharacter(from: .init(charactersIn: "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン")) != nil || string == ""{
            return true
        } else {
            return false
        }
    }

解决方法

根据我的观察,markedTextRange 直到 shouldChangeCharactersInRange 被调用后才会更新。假设我输入了一个 s,首先调用 shouldChangeCharactersInRange,然后更新 markedTextRange。这意味着很难区分“在英文键盘上输入第一个 's'”和“在罗马字键盘上输入第一个 's'”,我们希望禁止前者。在这两种情况下,markedTextRangeshouldChangeCharactersInRange 中都为零。

因此,我认为如果您改为在 editingChanged 上进行操作会更容易:

textfield.addTarget(self,action: #selector(textFieldChanged),for: .editingChanged)

...

let katakanas =
    "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン"
@objc func textFieldChanged() {
    let newString = textfield.text ?? ""
    if !(newString.count == 1 &&
            katakanas.contains(newString.first!)) && textfield.markedTextRange == nil {
        // perhaps show an error alert here too
        textfield.text = ""
    }
}

仅在文本更改和 markedTextRange 更新后才会调用此方法,因此 textfield.markedTextRange == nil 检查将正常工作。将整个文本字段设置为空白以防用户输入无效的内容对 UX 来说应该不会太糟糕,因为无论如何您都只打算接受一个字符。

您仍然可以使用 shouldChangeCharactersInRange 来防止用户在已经有一个片假名后输入更多字母:

func textField(_ textField: UITextField,shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool {
    if let firstChar = textField.text?.first,katakanas.contains(firstChar) && string != "" {
        return false
    }
    return true
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。