Swift:在一个ViewController中为两个输入框设置不同最大长度
嘿,这个问题我之前也碰到过,其实只要在代理方法里区分不同的输入框实例,就能给它们设置单独的最大长度啦!给你两种实用的解决方案:
方案一:直接在代理方法中区分输入框
这种方法简单直接,适合只有少数几个输入框的场景:
extension CreateNotViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 为每个输入框单独指定最大长度 let maxLength: Int if textField === notifTitle { maxLength = 15 // 标题框的最大长度 } else if textField === notifDescribtion { maxLength = 50 // 描述框的最大长度,改成你需要的数值 } else { maxLength = Int.max // 其他输入框默认不限制,按需调整 } let currentString = textField.text ?? "" let newString = (currentString as NSString).replacingCharacters(in: range, with: string) return newString.count <= maxLength } }
然后别忘了在viewDidLoad里把两个输入框的代理都设置为当前控制器:
override func viewDidLoad() { super.viewDidLoad() notifTitle.delegate = self notifDescribtion.delegate = self // 其他初始化代码... }
这个方案的核心是用===判断输入框的实例对象,从而给不同的输入框分配对应的最大长度限制。
方案二:给UITextField添加自定义maxLength属性(更灵活)
如果以后可能需要给更多输入框设置不同的长度限制,这种方法扩展性更好,不用每次都修改代理方法的判断逻辑:
首先给UITextField写一个扩展,通过关联对象添加maxLength属性:
import ObjectiveC // 定义关联对象的key private var maxLengthKey: UInt8 = 0 extension UITextField { var maxLength: Int? { get { return objc_getAssociatedObject(self, &maxLengthKey) as? Int } set { objc_setAssociatedObject(self, &maxLengthKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } } }
然后在viewDidLoad里直接给每个输入框设置对应的最大长度:
override func viewDidLoad() { super.viewDidLoad() notifTitle.delegate = self notifTitle.maxLength = 15 notifDescribtion.delegate = self notifDescribtion.maxLength = 50 // 其他初始化代码... }
最后修改代理方法,直接读取输入框的maxLength属性:
extension CreateNotViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // 如果没有设置maxLength,就不限制输入长度 guard let maxLength = textField.maxLength else { return true } let currentString = textField.text ?? "" let newString = (currentString as NSString).replacingCharacters(in: range, with: string) return newString.count <= maxLength } }
这样不管以后加多少个输入框,只要给它们设置maxLength属性就能自动生效,代码更干净易维护。
两种方案都能完美解决你的问题,按需选择就好~
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

