在 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 以限制字符数的主要内容,如果未能解决你的问题,请参考以下文章