一尘不染

最大长度UITextField

swift

当我尝试过时如何设置可以使用swift输入到UITextField中的最大字符数?,我看到如果我全部使用10个字符,我也无法删除该字符。

我唯一能做的就是取消该操作(一起删除所有字符)。

有谁知道如何不遮挡键盘(以便我不能添加其他字母/符号/数字,但可以使用退格键)?


阅读 264

收藏
2020-07-07

共1个答案

一尘不染

对于Swift 5和iOS
12,请尝试以下协议实现textField(_:shouldChangeCharactersIn:replacementString:)方法的实现UITextFieldDelegate

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let textFieldText = textField.text,
        let rangeOfTextToReplace = Range(range, in: textFieldText) else {
            return false
    }
    let substringToReplace = textFieldText[rangeOfTextToReplace]
    let count = textFieldText.count - substringToReplace.count + string.count
    return count <= 10
}
  • 该代码最重要的部分是从rangeNSRange)到rangeOfTextToReplaceRange<String.Index>)的转换。请参阅此视频教程,以了解为何此转换很重要。
  • 为了使此代码正常工作,您还应该将textFieldsmartInsertDeleteType值设置为UITextSmartInsertDeleteType.no。这将防止在执行粘贴操作时可能会插入(多余的)多余空间。

下面展示了如何实现完整的示例代码textField(_:shouldChangeCharactersIn:replacementString:)UIViewController

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
        textField.delegate = self
    }

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

}
2020-07-07