动态更新UITextView autocapitalizationType

时间:2016-01-21 03:16:51

标签: ios swift cocoa-touch uitextview

我有一个带有UITextView的空白测试应用程序,我添加了这个委托方法:

func textViewDidChange(textView: UITextView) {
    if textView.text.hasPrefix("Cap") {
        textView.autocapitalizationType = .AllCharacters
    } else {
        textView.autocapitalizationType = .Sentences
    }
}

如果用户在文本开头键入“Cap”,我希望textView更改为.AllCharacters autocapitalizationType。如果他们删除了该前缀,它应该改回句子。

代码被调用但没有兑现,键盘不会改变以反映这一点。知道如何轻推textView以更新大写字母吗?

2 个答案:

答案 0 :(得分:3)

非常有趣的问题。事实上,autocapitalizationType在键盘存在的情况下不会发生变化,但您可以通过重新签名并使其成为第一个响应者来轻推

textView.autocapitalizationType = .AllCharacters
// slow operation
textView.resignFirstResponder() 
textView.becomeFirstResponder()

问题是这个过程很慢,所以你会觉得每个角色之间有很大的延迟,所以你应该做一次这个操作。

func textViewDidChange(textView: UITextView) {
    if textView.text.hasPrefix("Cap") {
        if textView.autocapitalizationType != .AllCharacters {
            textView.autocapitalizationType = .AllCharacters
            textView.resignFirstResponder()
            textView.becomeFirstResponder()
        }
    } else {
        textView.autocapitalizationType = .Sentences
    }
} 

我希望有所帮助。

答案 1 :(得分:2)

辞退第一响应者以强制autocapitalizationType更改生效不是很干净。而是在更改autocapitalizationType后调用UITextView.reloadInputViews()。键盘保持打开状态并使用新的autocapitalizationType值。根据reloadInputViews()文档:

您可以使用此方法刷新与当前对象作为第一响应者的自定义输入视图或输入附件视图。视图将被立即替换-即无需将它们设置为动画。

这正是我临时选择键盘上的Shift键所需要的。