Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift2 如何同时限制UITextField长度和字符类型?_Swift2_Uitextfield_Limit - Fatal编程技术网

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

Swift2 如何同时限制UITextField长度和字符类型?,swift2,uitextfield,limit,Swift2,Uitextfield,Limit,我有一个iOS Xcode 7.3项目正在使用Swift2。我到处寻找,找到了限制UITextField中文本长度的方法。我还看到了限制在UITextField中键入的字符类型的方法 我在我的项目中使用了长度限制: func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { guard

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

我在我的项目中使用了长度
限制

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
}
一旦我将我的
UITextField
设置为
UITextField委托
,这两种方法都非常有效。然而,我需要我的项目同时做到这两个方面。我该怎么做?由于它们各自具有不同的
返回值
类型和值,如何将两者结合起来


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

只需在第一次检查条件是否为
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
}

您可以创建自己的自定义数字字段类,以便在项目中更轻松地使用它。只需重写awakeFromNib方法(加载后将调用该方法),在控件事件的字段中添加一个目标。编辑更改为监视用户输入并在其中设置键盘类型。您还需要将计算属性添加到字段中,以过滤不需要的字符:

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)
    }
}
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)
    }
}