如何阻止用户不在 UITextView iOS 中的文本开头键入 space?

How to stop the user not to type space in the beginning of the text in UITextView iOS?

我想在 iOS 的文本字段开头限制空格键的使用。我尝试使用以下逻辑,但它不允许单词之间的任何位置有空格。在这种情况下请帮助我。

if self.rangeOfCharacterFromSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()) != nil {
    return false
}
return true

如果你需要做你描述的事情,你可以使用UITextViewDelegate中的textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String)方法。

示例:

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
    // as @nhgrif suggested, we can skip the string manipulations if 
    // the beginning of the textView.text is not touched.
    guard range.location == 0 else {
        return true
    }

    let newString = (textView.text as NSString).stringByReplacingCharactersInRange(range, withString: text) as NSString
    return newString.rangeOfCharacterFromSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).location != 0
}

首先,我们构建将在 textView 中显示的新字符串。

然后我们检查它是否以空格、制表符或换行符开头。

如果是这样,我们 return false 因此 textView 不会将新文本放入。

否则,将新文本放入textView

注意:我们需要检查整个字符串而不是检查 replacementText 来处理复制粘贴操作。


另一种可能的方法是限制用户键入的文本,但在需要使用该值时修剪结果文本。

let myText = textView.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

编辑:根据@nhgrif 的评论,添加一个 guard 子句以提高方法的性能。

在 textView 委托中写入:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    guard range.location == 0 else {
        return true
    }
    let newString = (textView.text as NSString).replacingCharacters(in: range, with: text) as NSString
    return newString.rangeOfCharacter(from: CharacterSet.whitespacesAndNewlines).location != 0
}

对于文本字段

Swift5.2,Xcode11.4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard range.location == 0 else {
        return true
    }

    let newString = (textField.text! as NSString).replacingCharacters(in: range, with: string) as NSString
    return newString.rangeOfCharacter(from: CharacterSet.whitespacesAndNewlines).location != 0
}

Swift 4.1

只需一行代码即可停止空格

对于所有 UITextView

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    textView.text = textView.text.replacingOccurrences(of: " ", with: "")
}

对于单个 UITextView

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    if textView == textViewArea
    {
        textView.text = textView.text.replacingOccurrences(of: " ", with: "")
    }
    return true
}

这里改进了答案您可以禁用空格,直到您输入第一个字符

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    let whitespaceSet = NSCharacterSet.whitespaces
    let range = text.rangeOfCharacter(from: whitespaceSet)
    if let _ = range {
        let txt = textView.text ?? ""
        if txt.isBlankByTrimming || txt.isEmpty {
            return false
        }else {
            return true
        }
    }
    else {
        return true
    }
}

在此之后,在保存最终字符串之前,您可以 trim 字符串末尾的空格和换行符。

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()
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {        
        if (range.location == 0 && string == " ") {
            return false
        }
}