我创建了具有扩展名的协议,并正确设置了textfield方法,但是当我创建自定义类时,我获取了值,但无法发送回协议。
protocol Limiter {
var limit : Int {get set}
}
extension UIViewController: UITextFieldDelegate{
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let tf = textField.text ?? ""
guard let stringRange = Range(range, in: tf) else { return false }
// add their new text to the existing text
let updatedText = tf.replacingCharacters(in: stringRange, with: string)
print(updatedText)
return updatedText.count <= (textField as! Limiter).limit
}
}
//Custom class
class TextFieldLimiter: UITextField , Limiter{
var limit: Int = 0
@IBInspectable var maxLength: Int {
get {
print(limit)
return limit
}
set {
limit = newValue
print(limit)
}
}
}
我尝试了此代码,不确定是否做得正确。
所以,请帮帮我...
提前谢谢您
您可以使用此扩展名
import UIKit
// 1
private var maxLengths = [UITextField: Int]()
// 2
extension UITextField {
// 3
@IBInspectable var maxLength: Int {
get {
// 4
guard let length = maxLengths[self] else {
return Int.max
}
return length
}
set {
maxLengths[self] = newValue
// 5
addTarget(
self,
action: #selector(limitLength),
for: UIControl.Event.editingChanged
)
}
}
@objc func limitLength(textField: UITextField) {
// 6
guard let prospectiveText = textField.text, prospectiveText.count > maxLength else {
return
}
let selection = selectedTextRange
let maxCharIndex = prospectiveText.index(prospectiveText.startIndex, offsetBy: maxLength)
text = prospectiveText.substring(to: maxCharIndex)
selectedTextRange = selection
}
}