gpt4 book ai didi

ios - 如何使用协议(protocol)扩展为 UITextfield 的最大文本长度创建自定义类?

转载 作者:行者123 更新时间:2023-11-30 10:25:03 26 4
gpt4 key购买 nike

我已经创建了一个带有扩展的协议(protocol)并正确设置了文本字段方法,但是当我创建自定义类时,我获取了该值,但无法发送回协议(protocol)。

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)
}
}
}

我尝试了这段代码,但不确定我做得是否正确。

所以,请帮帮我......

提前谢谢

最佳答案

根据您的使用情况,可以在网络上找到多种解决方案

最好是使用 UITextFieldDelegate 协议(protocol),尤其是。 textField(_:shouldChangeCharactersIn:replacementString:):

  • 您可以让您的子类 TextFieldLimiter 实现委托(delegate)并在那里处理协议(protocol)方法。
    • 但这仅在没有设置其他委托(delegate)的情况下才有效,因为只能有一个。
  • 您可以在 View Controller 上实现委托(delegate)并检查发送者是否是TextFieldLimiter并检查那里的限制
    • 这会导致重复的代码
    • 但是您可以从那里委托(delegate)给要编写的 validate 函数,您将在 TextFieldLimiter 中实现该函数

您也可以在子类 TextFieldLimiter 中尝试此操作,而不使用委托(delegate),例如覆盖 override func canPerformAction 并检查它是否是粘贴操作,然后检查粘贴是否缓冲区太大或不允许该操作或不允许。但这有点棘手,您还必须考虑撤消情况。

关于ios - 如何使用协议(protocol)扩展为 UITextfield 的最大文本长度创建自定义类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60108256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com