如何限制 Swift 中不同 UITextField 的文本长度?
How do I limit text lengths for different UITextFields in Swift?
我有一个 iOS
Xcode 7.3 Swift2
项目正在处理。它有不同的 UITextFields
限制为 3 数字,特别是数字。他们被分配到 UITextFieldDelegate
并且运行良好。
这里是我限制它们的地方:
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
}
但是,某些 UITextFields
仍然需要限制为数字并且还限制为 单个 数字,我如何在上面的部分中设置它,仅针对那些特定的 UITextFields
?
需为个位数的UITextFields
姓名为:
widthInches
lengthInches
我试过把它放在第一个守卫区之后,但没有成功:
guard let text2 = widthInches.text else { return true }
let newLength2 = text2.characters.count + string.characters.count - range.length
let limitLength2 = 3
if newLength2 > limitLength2 {
return false
}
你好,在你的 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
中,textField
参数是触发此事件的文本字段,因此你可以检查你的文本字段对象,如果等于其中一个对象,则做出不同的行为
希望对你有帮助,
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return (textField.text?.utf16.count ?? 0) + string.utf16.count - range.length <= TEXT_FIELD_LIMIT
}
这会计算基于 UTF-16 表示的字符数,因为 range.length 是以 UTF-16 为基础的。如果需要用其他方式统计字符数,表达式可能会变长。如果您只想输入数字,请使用 textField.keyboardType = UIKeyboardTypeDecimalPad
。如果您想要特定的文本字段,然后添加标签并比较它们,如果它们相等,您可以为此实现您的特定代码。
查看此 link 以获得详细答案:
http://www.globalnerdy.com/2016/05/24/a-better-way-to-program-ios-text-fields-that-have-maximum-lengths-and-accept-or-reject-specific-characters/
函数shouldChangeCharactersInRange
传入特定的文本字段作为其参数之一。您可以查看它,看看它是否指向与您要缩短的实例相同的实例,如下所示:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
var limitLength = 3
if textField == widthInches || textField == lengthInches {
limitLength = 1
}
let newLength = text.characters.count + string.characters.count - range.length
if newLength > limitLength {
return false
}
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
假设所有其他要求都相同(仅数字),这就可以了。
还有其他方法,例如 - 您可以子类化 UITextField 并添加一个 limitLength 字段,然后在委托中使用该字段,但这对于仅 2 个例外来说可能有点矫枉过正。
您也可以尝试使用此代码来限制文本字段
实际上我在这里使用文本字段标签。因为自定义文本字段。
如果您在此条件标签中使用像 TextfieldEffect 这样的自定义文本字段,将帮助您限制文本字段。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
if textField.tag == txtCountryCode.tag{
let maxLength = 4
let currentString: NSString = textField.text!
let newString: NSString =
currentString.stringByReplacingCharactersInRange(range, withString: string)
return newString.length <= maxLength
}
if textField.tag == txtMobileNumber.tag{
let maxLength = 10
let currentString: NSString = textField.text!
let newString: NSString =
currentString.stringByReplacingCharactersInRange(range, withString: string)
return newString.length <= maxLength
}
return true
}
希望对您有所帮助。
更新 swift 3 添加此 class 并将其命名为 TextField.swift。它将在故事板上添加限制输入。
import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self] else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
// Any text field with a set max length will call the limitLength
// method any time it's edited (i.e. when the user adds, removes,
// cuts, or pastes characters to/from the text field).
addTarget(
self,
action: #selector(limitLength),
for: UIControlEvents.editingChanged
)
}
}
func limitLength(textField: UITextField) {
guard let prospectiveText = textField.text,
prospectiveText.characters.count > maxLength else {
return
}
// If the change in the text field's contents will exceed its maximum
length,
// allow only the first [maxLength] characters of the resulting text.
let selection = selectedTextRange
// text = prospectiveText.substring(with:Range<String.Index>
(prospectiveText.startIndex ..< prospectiveText.index(after: maxLength))
let s = prospectiveText
// Get range 4 places from the start, and 6 from the end.
let c = s.characters;
let r = c.index(c.startIndex, offsetBy: 0)..<c.index(c.endIndex, offsetBy: maxLength - c.count)
text = s[r]
// Access the string by the range.
selectedTextRange = selection
}
}
或在此处下载 - >TextField.swift
我有一个 iOS
Xcode 7.3 Swift2
项目正在处理。它有不同的 UITextFields
限制为 3 数字,特别是数字。他们被分配到 UITextFieldDelegate
并且运行良好。
这里是我限制它们的地方:
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
}
但是,某些 UITextFields
仍然需要限制为数字并且还限制为 单个 数字,我如何在上面的部分中设置它,仅针对那些特定的 UITextFields
?
需为个位数的UITextFields
姓名为:
widthInches
lengthInches
我试过把它放在第一个守卫区之后,但没有成功:
guard let text2 = widthInches.text else { return true }
let newLength2 = text2.characters.count + string.characters.count - range.length
let limitLength2 = 3
if newLength2 > limitLength2 {
return false
}
你好,在你的 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
中,textField
参数是触发此事件的文本字段,因此你可以检查你的文本字段对象,如果等于其中一个对象,则做出不同的行为
希望对你有帮助,
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return (textField.text?.utf16.count ?? 0) + string.utf16.count - range.length <= TEXT_FIELD_LIMIT
}
这会计算基于 UTF-16 表示的字符数,因为 range.length 是以 UTF-16 为基础的。如果需要用其他方式统计字符数,表达式可能会变长。如果您只想输入数字,请使用 textField.keyboardType = UIKeyboardTypeDecimalPad
。如果您想要特定的文本字段,然后添加标签并比较它们,如果它们相等,您可以为此实现您的特定代码。
查看此 link 以获得详细答案: http://www.globalnerdy.com/2016/05/24/a-better-way-to-program-ios-text-fields-that-have-maximum-lengths-and-accept-or-reject-specific-characters/
函数shouldChangeCharactersInRange
传入特定的文本字段作为其参数之一。您可以查看它,看看它是否指向与您要缩短的实例相同的实例,如下所示:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
var limitLength = 3
if textField == widthInches || textField == lengthInches {
limitLength = 1
}
let newLength = text.characters.count + string.characters.count - range.length
if newLength > limitLength {
return false
}
let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
let stringFromTextField = NSCharacterSet.init(charactersInString: string)
let strValid = numberOnly.isSupersetOfSet(stringFromTextField)
return strValid
}
假设所有其他要求都相同(仅数字),这就可以了。
还有其他方法,例如 - 您可以子类化 UITextField 并添加一个 limitLength 字段,然后在委托中使用该字段,但这对于仅 2 个例外来说可能有点矫枉过正。
您也可以尝试使用此代码来限制文本字段
实际上我在这里使用文本字段标签。因为自定义文本字段。 如果您在此条件标签中使用像 TextfieldEffect 这样的自定义文本字段,将帮助您限制文本字段。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
if textField.tag == txtCountryCode.tag{
let maxLength = 4
let currentString: NSString = textField.text!
let newString: NSString =
currentString.stringByReplacingCharactersInRange(range, withString: string)
return newString.length <= maxLength
}
if textField.tag == txtMobileNumber.tag{
let maxLength = 10
let currentString: NSString = textField.text!
let newString: NSString =
currentString.stringByReplacingCharactersInRange(range, withString: string)
return newString.length <= maxLength
}
return true
}
希望对您有所帮助。
更新 swift 3 添加此 class 并将其命名为 TextField.swift。它将在故事板上添加限制输入。
import UIKit
private var maxLengths = [UITextField: Int]()
extension UITextField {
@IBInspectable var maxLength: Int {
get {
guard let length = maxLengths[self] else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
// Any text field with a set max length will call the limitLength
// method any time it's edited (i.e. when the user adds, removes,
// cuts, or pastes characters to/from the text field).
addTarget(
self,
action: #selector(limitLength),
for: UIControlEvents.editingChanged
)
}
}
func limitLength(textField: UITextField) {
guard let prospectiveText = textField.text,
prospectiveText.characters.count > maxLength else {
return
}
// If the change in the text field's contents will exceed its maximum
length,
// allow only the first [maxLength] characters of the resulting text.
let selection = selectedTextRange
// text = prospectiveText.substring(with:Range<String.Index>
(prospectiveText.startIndex ..< prospectiveText.index(after: maxLength))
let s = prospectiveText
// Get range 4 places from the start, and 6 from the end.
let c = s.characters;
let r = c.index(c.startIndex, offsetBy: 0)..<c.index(c.endIndex, offsetBy: maxLength - c.count)
text = s[r]
// Access the string by the range.
selectedTextRange = selection
}
}
或在此处下载 - >TextField.swift