【问题标题】:Create UITextFieldDelegate to Limit Character Count in Swift在 Swift 中创建 UITextFieldDelegate 以限制字符数
【发布时间】: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 帖子的可能副本:stackoverflow.com/questions/31363216/…
  • 类似,是的,但我希望在不向情节提要添加解决方案的情况下以编程方式解决此问题。
  • 阿拉丁的回答不是你需要的吗?它不使用情节提要。

标签: swift xcode delegates uitextfield uitextfielddelegate


【解决方案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 我感谢您的帮助。你能解释一下为什么你的第一个解决方案有效吗?我不明白使用的语法。
【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多