【问题标题】:How do I disable the "Space" Key on the keyboard in Swift?如何在 Swift 中禁用键盘上的“空格”键?
【发布时间】:2015-01-26 03:22:47
【问题描述】:

我正在创建一个登录系统,我不希望在用户名字段中允许有空格。我不想检查和验证字段,而是想防止添加空格。

因此,每次用户按下空格键时,都不会发生任何事情。我怎样才能做到这一点? 我见过 Instagram 这样做。

这是我目前的代码:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var signUp: UIBarButtonItem!
    @IBOutlet weak var navBar: UINavigationBar!
    @IBOutlet weak var UsernameText: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

             self.navigationController?.navigationBar.clipsToBounds = true
        UsernameText.attributedPlaceholder = NSAttributedString(string:"TypeYourUsername",
            attributes:[NSForegroundColorAttributeName: UIColor.whiteColor()])

        func textField(UsernameText: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
            if (string == " ") {
                return false
            }
            return true
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(animated: Bool) {
        UsernameText.becomeFirstResponder()
    }


    override func prefersStatusBarHidden() -> Bool {
        return true
    }
}

【问题讨论】:

  • 谢谢!它节省了我的时间。

标签: ios swift keyboard


【解决方案1】:

是的,你可以做到。覆盖UITextField 委托方法shouldChangeCharactersInRange。并在该方法中检查空格字符。如果找到则返回 false。

注意:不要忘记为文本字段设置委托。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    if (string == " ") {
        return false
    }
    return true
}

编辑:更多代码

class ViewController : UIViewController, UITextFieldDelegate {

    @IBOutlet weak var textField : UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if (string == " ") {
          return false
        }
        return true
    }
}

这里textField 对象是一个IBOutlet。这意味着文本字段控件在情节提要中并与此变量相关。

【讨论】:

  • 感谢您的回复。但仍然不起作用,我将上面的代码粘贴到我的问题中。空格键仍然是在 twext 字段中留出空格。再次感谢@Kampai
  • 这仍然允许您在空格中粘贴。
【解决方案2】:

在 Swift 2.0 中

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let whitespaceSet = NSCharacterSet.whitespaceCharacterSet()
    let range = string.rangeOfCharacterFromSet(whitespaceSet)
    if let _ = range {
        return false
    }
    else {
        return true
    }
}

【讨论】:

    【解决方案3】:

    在 Swift 2.1 中

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        let whitespaceSet = NSCharacterSet.whitespaceCharacterSet()
        if let _ = string.rangeOfCharacterFromSet(whitespaceSet) {
           return false
           }
        return true
    }
    

    【讨论】:

      【解决方案4】:

      斯威夫特 3

      class SignUpViewController: UIViewController, UITextFieldDelegate {
      
      lazy var emailTextField: UITextField = {
          let tf = UITextField()
          tf.translatesAutoresizingMaskIntoConstraints = false
          tf.placeholder = "Email address"
          tf.delegate = self
          return tf
      }()
      
      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
          let whitespaceSet = NSCharacterSet.whitespaces
      
          if let _ = string.rangeOfCharacter(from: whitespaceSet) {
              return false
          }
          else {
              return true
          }
      }
      }
      

      【讨论】:

        【解决方案5】:

        斯威夫特 4.1/4.2/5.0/5.1/5.2

        func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            if string == " " {
                return false
            }
            return true
        }
        

        【讨论】:

          【解决方案6】:
          func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
              let whitespaceSet = CharacterSet.whitespaces
              if let _ = string.rangeOfCharacter(from: whitespaceSet) {
                  return false
              } else {
                  return true
              }
          }
          

          【讨论】:

            【解决方案7】:

            Swift 4.1

            只需简单的一行代码就可以停止空格

            适用于所有文本字段

             func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
            
                    textField.text = textField.text?.replacingOccurrences(of: " ", with: "")
                    return true
                }
            

            对于单个文本字段

            func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
            
                if textField == txtid
                {
                    textField.text = textField.text?.replacingOccurrences(of: " ", with: "")
                }
                return true
            }
            

            【讨论】:

              【解决方案8】:

              您可以在此处禁用 WhiteSpaces,直到您的(第一个字符)文本输入。 (一些改进)

               func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                      let whitespaceSet = NSCharacterSet.whitespaces
                      let range = string.rangeOfCharacter(from: whitespaceSet)
                      if let _ = range {
                          let text = textField.text ?? ""
                          if text.isBlankByTrimming || text.isEmpty {
                              return false
                          }else {
                             return true
                          }
                      }
                      else {
                          return true
                      }
                  }
              

              在这里你可以使用这个扩展来修剪空白。(即使你正在检查你的验证) 使用上面的文本字段 Delegate 你可以禁用空格,但如果有这样的字符串

               Example : "MyName Surname             "  
              

              因此也可以在保存此数据之前修剪结束空格。

                  extension String {
                      var isBlankByTrimming: Bool {
                          let trimmed = self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
                          return trimmed.isEmpty
                      } 
                     func trimWhitespacesAndNewlines() -> String{
                            return self.trimmingCharacters(in: 
                                              CharacterSet.whitespacesAndNewlines)
                      }
                   }
              

              供使用::

              let yourString = "MyName Surname          " 
              let finalString = yourString.trimWhitespacesAndNewlines()
              

              【讨论】:

                【解决方案9】:

                斯威夫特 5

                func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                    return string != " "
                }
                

                这对我来说是最容易理解的语法。

                【讨论】:

                  【解决方案10】:

                  您可以使用以下逻辑检查用户是否点击了空格键并忽略它。但我认为你不能禁用按钮本身。

                  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
                    string != " "
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2016-05-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-12-31
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多