在 Swift 中创建 UITextFieldDelegate 以限制字符数

Posted

技术标签:

【中文标题】在 Swift 中创建 UITextFieldDelegate 以限制字符数【英文标题】:Create UITextFieldDelegate to Limit Character Count in Swift 【发布时间】:2017-12-08 12:14:50 【问题描述】:

我是代理新手,我正在尝试使用 UITextFieldDelegate。我的目标是将此文本字段中的字符数限制为五个字符,就好像我正在创建一个邮政编码文本字段一样。

我正在使用带有文本字段的现成视图控制器,并创建了一个名为 ZipCodeDelegate.swift 的委托文件。我已经修改了情节提要中的文本字段,以在用户点击该字段时显示数字键盘。这是我的视图控制器:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate 

// MARK: Outlets

@IBOutlet weak var zipTextField: UITextField!

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


这是我的委托文件:

import Foundation
import UIKit

class ZipCodeDelegate: NSObject, UITextFieldDelegate 



我不知道下一步该做什么。我不确定如何限制文本字段的字符数,以及告诉视图控制器这个委托文件存在并且它应该控制所述文本字段。

【问题讨论】:

此 SO 帖子的可能副本:***.com/questions/31363216/… 类似,是的,但我希望在不向情节提要添加解决方案的情况下以编程方式解决此问题。 阿拉丁的回答不是你需要的吗?它不使用情节提要。 【参考方案1】:

将此UITextField 代表用于邮政编码和Int 限制字符数

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 

    if string.rangeOfCharacter(from: NSCharacterSet.decimalDigits.inverted) == nil
        let len = (textField.text?.characters.count)! + string.characters.count
        if len <= 5 
            return true
        
    
    return false

UITextField检查最大字符限制的委托方法。

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

    var oldlength : Int = 0
    if textField.text != nil
    
        oldlength = (textField.text?.count)!
    

    let replaceMentLength : Int = string.count
    let rangeLength : Int = range.length

    let newLength : Int = oldlength - rangeLength + replaceMentLength

    return newLength <= charaterLimit || false

【讨论】:

shouldChangeCharactersIn 方法成功了。我更新了我的 viewController 类以包括: let zipCodeDelegate = ZipCodeDelegate() 以及在 viewDidLoad 方法中分配委托,如下所示: self.zipTextField.delegate = zipCodeDelegate 我感谢您的帮助。你能解释一下为什么你的第一个解决方案有效吗?我不明白使用的语法。 必读这篇文章Implementing UITextFieldDelegate in a separate class【参考方案2】:

斯威夫特 4

public class LimitedUITextField: UITextField, UITextFieldDelegate 
    var maxNumber: Int = 0 
        didSet 
            self.delegate = self
        
    


    public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
        guard let textFieldText = self.text,
            let rangeOfTextToReplace = Range(range, in: textFieldText) else 
                return false
        
        let substringToReplace = textFieldText[rangeOfTextToReplace]
        let count = textFieldText.count - substringToReplace.count + string.count
        return count <= self.maxNumber
    

【讨论】:

以上是关于在 Swift 中创建 UITextFieldDelegate 以限制字符数的主要内容,如果未能解决你的问题,请参考以下文章

swift 在Swift中创建一个委托

如何在 Swift 中创建 UIAlertView?

swift 在swift中创建http get请求

在 Swift 中创建实例时是不是使用 var 或 let?

在 Swift 中创建 UIAlertAction

如何在 Swift 3 中创建调度队列