如何同时限制 UITextField 长度和字符类型?
How do I limit UITextField length AND character types at the same time?
我有一个 iOS Xcode 7.3 项目,我正在使用 Swift2
。我查看了所有内容并找到了限制 UITextField
中文本长度的方法。我还看到了限制在 UITextField
.
中键入的字符类型的方法
我在我的项目中使用了长度 limit
:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.characters.count + string.characters.count - range.length
let limitLength = 3
return newLength <= limitLength
}
我用它来将文本限制为仅数值:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
一旦我将 UITextField
设置为 UITextFieldDelegate
,两者都很好用。但是,我需要我的项目来完成这两项工作。我怎么做?我如何将两者结合起来,因为它们各自具有不同的 return
类型和值?
问题是当我使用 iPad 时,它允许使用数字以外的其他字符,因为 iPad 的 .NumberPad
允许 &,$,%
等字符,等 iPhone 没有问题,但我的项目是一个通用应用程序。
如果条件是false
,则只从第一种检查return,否则继续进行第二次检查:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.characters.count + string.characters.count - range.length
let limitLength = 3
if newLength > limitLength {
return false
}
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
您可以创建自己的自定义数字字段 class 以便更轻松地在您的项目中使用它。只需重写 awakeFromNib 方法(它在加载后被调用),将目标添加到您的字段以控制事件 .EditingChanged 以监视用户输入并在那里设置您的键盘类型。您还需要在字段中添加计算 属性 以过滤不需要的字符:
import UIKit
@IBDesignable
class NumericField: UITextField {
@IBInspectable var maxLength: Int = 3
@IBInspectable var allowedCharacters: String = "0123456789"
var filteredText: String {
return String((text ?? "")
.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: allowedCharacters)
.invertedSet)
.joinWithSeparator("")
.characters.prefix(maxLength))
}
override func awakeFromNib() {
super.awakeFromNib()
keyboardType = .NumberPad
addTarget(self, action: #selector(editingChanged), forControlEvents: .EditingChanged)
editingChanged(self)
}
func editingChanged(sender: UITextField) {
sender.text = String(Int(filteredText) ?? 0)
}
}
我有一个 iOS Xcode 7.3 项目,我正在使用 Swift2
。我查看了所有内容并找到了限制 UITextField
中文本长度的方法。我还看到了限制在 UITextField
.
我在我的项目中使用了长度 limit
:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.characters.count + string.characters.count - range.length
let limitLength = 3
return newLength <= limitLength
}
我用它来将文本限制为仅数值:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
一旦我将 UITextField
设置为 UITextFieldDelegate
,两者都很好用。但是,我需要我的项目来完成这两项工作。我怎么做?我如何将两者结合起来,因为它们各自具有不同的 return
类型和值?
问题是当我使用 iPad 时,它允许使用数字以外的其他字符,因为 iPad 的 .NumberPad
允许 &,$,%
等字符,等 iPhone 没有问题,但我的项目是一个通用应用程序。
如果条件是false
,则只从第一种检查return,否则继续进行第二次检查:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.characters.count + string.characters.count - range.length
let limitLength = 3
if newLength > limitLength {
return false
}
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
您可以创建自己的自定义数字字段 class 以便更轻松地在您的项目中使用它。只需重写 awakeFromNib 方法(它在加载后被调用),将目标添加到您的字段以控制事件 .EditingChanged 以监视用户输入并在那里设置您的键盘类型。您还需要在字段中添加计算 属性 以过滤不需要的字符:
import UIKit
@IBDesignable
class NumericField: UITextField {
@IBInspectable var maxLength: Int = 3
@IBInspectable var allowedCharacters: String = "0123456789"
var filteredText: String {
return String((text ?? "")
.componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: allowedCharacters)
.invertedSet)
.joinWithSeparator("")
.characters.prefix(maxLength))
}
override func awakeFromNib() {
super.awakeFromNib()
keyboardType = .NumberPad
addTarget(self, action: #selector(editingChanged), forControlEvents: .EditingChanged)
editingChanged(self)
}
func editingChanged(sender: UITextField) {
sender.text = String(Int(filteredText) ?? 0)
}
}