如何阻止用户不在 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
}
}
我想在 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
}
}