如何同时限制UITextField长度和字符类型?

时间:2016-05-27 20:56:08

标签: swift2 uitextfield limit

我有一个iOS Xcode 7.3项目,我正在使用Swift2。我看了一遍,找到了限制UITextField中文字长度的方法。我也看到了限制在UITextField中输入的字符类型的方法。

我在我的项目中使用了limit长度:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.characters.count + string.characters.count - range.length
    let limitLength = 3
    return newLength <= limitLength
}

我用它将文本限制为仅数值:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
    let stringFromTextField = NSCharacterSet.init(charactersInString: string)
    let strValid = numberOnly.isSupersetOfSet(stringFromTextField)

    return strValid
}

UITextField设置为UITextFieldDelegate后,两者都很有效。但是,我需要我的项目来做这两件事。我怎么做?如何将两者结合起来,因为它们各自具有不同的return类型和值?

问题是,当我使用iPad时,它允许除数字之外的其他字符,因为iPad的.NumberPad允许使用&,$,%等字符.iPhone没有问题,但我的project是一个通用应用程序。

2 个答案:

答案 0 :(得分:1)

如果条件为false,只需从第一种检查中返回,否则继续进行第二次检查:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    guard let text = textField.text else { return true }
    let newLength = text.characters.count + string.characters.count - range.length
    let limitLength = 3
    if newLength > limitLength {
        return false
    }

    let numberOnly = NSCharacterSet.init(charactersInString: "0123456789")
    let stringFromTextField = NSCharacterSet.init(charactersInString: string)
    let strValid = numberOnly.isSupersetOfSet(stringFromTextField)

    return strValid
}

答案 1 :(得分:1)

您可以创建自己的自定义数字字段类,以便在项目中更轻松地使用它。只需重写方法awakeFromNib(它一旦被加载就被调用),将一个目标添加到你的字段中以进行控制事件.EditingChanged监视用户输入并在那里设置你的键盘类型。您还需要在字段中添加计算属性以过滤不需要的字符:

import UIKit

@IBDesignable
class NumericField: UITextField {
    @IBInspectable var maxLength: Int = 3
    @IBInspectable var allowedCharacters: String = "0123456789"
    var filteredText: String {
        return String((text ?? "")
            .componentsSeparatedByCharactersInSet(NSCharacterSet(charactersInString: allowedCharacters)
            .invertedSet)
            .joinWithSeparator("")
            .characters.prefix(maxLength))
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        keyboardType = .NumberPad
        addTarget(self, action: #selector(editingChanged), forControlEvents: .EditingChanged)
        editingChanged(self)
    }
    func editingChanged(sender: UITextField) {
        sender.text = String(Int(filteredText) ?? 0)
    }
}