在Swift中设置UITextField的最大字符长度

ish*_*r88 64 string character uitextfield ios swift

我知道还有其他主题,但我似乎无法找到如何实现它.

我试图将UITextField限制为只有5个字符

优选字母数字和 - 和.和_

我见过这段代码

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
                       replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text
    let newString: NSString =
             currentString.stringByReplacingCharactersInRange(range, withString: string)
    return newString.length <= maxLength
}
Run Code Online (Sandbox Code Playgroud)

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let length = count(textField.text.utf16) + count(string.utf16) - range.length
    return length <= 10 
}
Run Code Online (Sandbox Code Playgroud)

我只是不知道如何实际实现它或我应该换出哪个"textfield"我的自定义命名为UITextField

Ala*_*din 108

  1. 您的视图控制器应符合UITextFieldDelegate,如下所示:

    class MyViewController: UIViewController, UITextFieldDelegate {
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 设置文本字段的委托: myTextField.delegate = self

  3. 在视图控制器中实现该方法: textField(_:shouldChangeCharactersInRange:replacementString:)

全部一起:

class MyViewController: UIViewController,UITextFieldDelegate  //set delegate to class 

@IBOutlet var mytextField: UITextField             //  textfield variable 

override func viewDidLoad() {
    super.viewDidLoad()
    mytextField.delegate = self                  //set delegate
}


func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
                       replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text
    let newString: NSString =
             currentString.stringByReplacingCharactersInRange(range, withString: string)
    return newString.length <= maxLength
}
Run Code Online (Sandbox Code Playgroud)

对于Swift 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let maxLength = 1
    let currentString: NSString = textField.text! as NSString
    let newString: NSString =
        currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength
}
Run Code Online (Sandbox Code Playgroud)

仅允许将一组指定的字符输入给定的文本字段

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
  var result = true

  if mytextField == numberField {
    if count(string) > 0 {
      let disallowedCharacterSet = NSCharacterSet(charactersInString: "0123456789.-").invertedSet
      let replacementStringIsLegal = string.rangeOfCharacterFromSet(disallowedCharacterSet) == nil
      result = replacementStringIsLegal
    }
  }

  return result
}
Run Code Online (Sandbox Code Playgroud)

如何编写仅包含最大长度的数字输入的iOS文本字段


Fat*_*tie 103

2017年12月.斯威夫特4.

请注意,您将在网上看到的有关此问题的大部分示例代码都已过时.

只需将以下内容粘贴到项目中的任何Swift文件中即可.将文件命名为any,例如"Handy.swift"

这最终解决了iOS中最愚蠢的问题之一:

在此输入图像描述

您的文本字段现在有一个.maxLength.

在开发期间在storyboard中设置该值是完全可以的,或者在应用程序运行时将其设置为代码.

// simply have this in any Swift file, say, Handy.swift

import UIKit
private var __maxLengths = [UITextField: Int]()
extension UITextField {
    @IBInspectable var maxLength: Int {
        get {
            guard let l = __maxLengths[self] else {
               return 150 // (global default-limit. or just, Int.max)
            }
            return l
        }
        set {
            __maxLengths[self] = newValue
            addTarget(self, action: #selector(fix), for: .editingChanged)
        }
    }
    func fix(textField: UITextField) {
        let t = textField.text
        textField.text = t?.prefix(maxLength)
    }
}
Run Code Online (Sandbox Code Playgroud)

就这么简单.


(注意:"safelyLimitedTo #length"只是一个调整String长度的调用.所有Swift程序员都有自己的扩展,或者,只使用我在那里看到的.)


一个更简单的一次性版本......

以上修复项目中的所有文本字段.

如果您只想将一个特定的文本字段简单地限制为"4",那就是......

class PinCodeEntry: UITextField {

    override func didMoveToSuperview() {

        super.didMoveToSuperview()
        addTarget(self, action: #selector(fixMe), for: .editingChanged)
    }

    @objc private func fixMe() { text = text?.prefix(4) }
}
Run Code Online (Sandbox Code Playgroud)

唷!这里的所有都是它的.

(顺便说一句,这是一个与UIText View相关的非常有用的提示, https: //stackoverflow.com/a/42333832/294884 )

  • 所有这一切都必须完成,以实现如此普遍和如此简单的事情让我大吃一惊.他们不能只给我们一个简单的textField.maxLength内置...无论如何你的解决方案很棒,谢谢! (8认同)
  • 使用此解决方案的警告!该解决方案存在一些问题。其中之一是,如果用户在文本字段的开头键入,您将允许他们键入新字符,最后一个字符将被删除,而且光标将跳转到字段中的最后一个字符。另一个问题是,如果您以编程方式设置文本,它将允许您设置大于限制的文本。如果您撤消更改(使用外部键盘的 CMD+Z),则会出现另一个问题,如果您之前尝试添加超出限制的数字,则会崩溃。 (5认同)
  • 似乎是合法的!谢谢。 (2认同)
  • 该解决方案很方便,但顶部的文本字段地图实际上会产生一个保留周期. (2认同)

Сер*_*лык 18

Swift 4,只需使用:

public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    return range.location < 10
}
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用.如果您点击字符串的中间并且您可以键入超过X个字符,该怎么办? (4认同)
  • 如果您想在 **过去** 操作中工作,则在过去文本时不起作用,您应该添加 `string.count &lt; MAX_LENGTH` (3认同)
  • 这是行不通的。位置不是字符串的长度,而是光标/选择的位置。 (2认同)

Pav*_*los 10

Steven Schmatz使用Swift 3.0的方式与此相同:

//max Length
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,
               replacementString string: String) -> Bool
{
    let maxLength = 4
    let currentString: NSString = textField.text! as NSString
    let newString: NSString = currentString.replacingCharacters(in: range, with: string) as NSString
    return newString.length <= maxLength
}
Run Code Online (Sandbox Code Playgroud)


Ash*_*han 10

对于 Swift 5:
只需写一行来设置最大字符长度:

 self.textField.maxLength = 10
Run Code Online (Sandbox Code Playgroud)

欲了解更多详情,请点击此处

信用:http : //www.swiftdevcenter.com/max-character-limit-of-uitextfield-and-allowed-characters-swift/

  • 虽然这个解决方案看起来很简单,但实际上需要更多代码来实现它。这个答案本身并不是很有帮助,添加解释并包含其他相关代码片段可能会有所帮助。 (2认同)

ZaE*_*FaR 6

我认为扩展对此更为方便.在这里看到完整答案

private var maxLengths = [UITextField: Int]()

// 2
extension UITextField {

  // 3
  @IBInspectable var maxLength: Int {
    get {
      // 4
      guard let length = maxLengths[self] else {
        return Int.max
      }
      return length
    }
    set {
      maxLengths[self] = newValue
      // 5
      addTarget(
        self,
        action: #selector(limitLength),
        forControlEvents: UIControlEvents.EditingChanged
      )
    }
  }

  func limitLength(textField: UITextField) {
    // 6
    guard let prospectiveText = textField.text
      where prospectiveText.characters.count > maxLength else {
        return
    }

    let selection = selectedTextRange
    // 7
    text = prospectiveText.substringWithRange(
      Range<String.Index>(prospectiveText.startIndex ..< prospectiveText.startIndex.advancedBy(maxLength))
    )
    selectedTextRange = selection
  }

}
Run Code Online (Sandbox Code Playgroud)


obe*_*ber 5

不使用委托的简单解决方案:

TEXT_FIELD.addTarget(self, action: #selector(editingChanged(sender:)), for: .editingChanged)


@objc private func editingChanged(sender: UITextField) {

        if let text = sender.text, text.count >= MAX_LENGHT {
            sender.text = String(text.dropLast(text.count - MAX_LENGHT))
            return
        }
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在寻找的答案:D (2认同)

avi*_*ran 5

我的 Swift 4 版本 shouldChangeCharactersIn

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

        guard let preText = textField.text as NSString?,
            preText.replacingCharacters(in: range, with: string).count <= MAX_TEXT_LENGTH else {
            return false
        }

        return true
    }
Run Code Online (Sandbox Code Playgroud)