Swift iOS - 如何仅测试在 TextView 中输入的 Return "\n" 关键字符

Swift iOS -How to test for only Return "\n" key character being entered inside a TextView

我有一个使用委托

测试白色 space 的 textView
fileprivate let whitespace = CharacterSet.whitespaces

func textViewDidChange(_ textView: UITextView) {
        if textView.text!.trimmingCharacters(in: whitespace) == ""{
            sendButton.isEnabled = false
        }else{
            sendButton.isEnabled = true
        }
    }

func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text!.trimmingCharacters(in: whitespace) == ""{
            sendButton.isEnabled = false
            sendButton.layer.backgroundColor = UIColor.lightGray.cgColor
        }else{
            sendButton.isEnabled = true
            sendButton.layer.backgroundColor = UIColor.red.cgColor
        }
    }

如果用户输入全部 space,则 sendButton 永远不会启用。但是,如果用户输入 1 个或多个 return 个关键字符“\n”,它仍会被识别为一个字符,并且 sendButton 会启用。

在 textView 委托 shouldChangeTextInRangetextViewDidChangetextViewDidEndEditing 中,我尝试添加 textView.text! == "\n":

fileprivate let whitespace = CharacterSet.whitespaces

func textViewDidChange(_ textView: UITextView) {
        if textView.text!.trimmingCharacters(in: whitespace) == "" || textView.text! == "\n"{
            sendButton.isEnabled = false
        }else{
            sendButton.isEnabled = true
        }    }

func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text!.trimmingCharacters(in: whitespace) == "" || textView.text! == "\n"{
            sendButton.isEnabled = false
        }else{
            sendButton.isEnabled = true
        }
    }

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if textView.text!.trimmingCharacters(in: whitespace) == "" || textView.text! == "\n"{
            sendButton.isEnabled = false
        }else{
            sendButton.isEnabled = true
        }
        return true
    }

按钮仍然可用。

如何获得与仅测试白色 space 相同的响应?

想想你在这里做什么:

    if textView.text!.trimmingCharacters(in: whitespace) == "" || textView.text! == "\n" {

把它分成几块:

    // Part 1 - get the text from textView, and remove whitespace characters
    textView.text!.trimmingCharacters(in: whitespace)

    // Part 2 - get the text from textView
    textView.text!

    IF "Part 1" == ""
    OR
    IF "Part 2" == "\n"

那么,如果 textView 包含 4 个空格和一个回车符会怎样 return?

第 1 部分不正确,因为删除空格后会留下“\n”

第 2 部分不正确,因为它是“(四个空格)\n”

这应该可以解释为什么您当前的代码没有达到您的预期。

但是,正如@rmaddy 所建议的那样,应该这样做:

func textViewDidChange(_ textView: UITextView) {
    let str = textView.text.trimmingCharacters(in: .whitespacesAndNewlines)
    if str == "" {
        sendButton.isEnabled = false
    } else {
        sendButton.isEnabled = true
    }
}