限制NSTextField输入格式
2019-07-08 本文已影响0人
_我和你一样
格式化可以验证输入的有效性,这里有苹果的官网文档:数据格式化
我想实现当用户输入手机号时,只能输入 11 位数字,并且在输入过程中,对数字进行分组。分组使用空格。类似于"187 3897 1797"这种格式。
那么我继承了一个 NumberFormatter来实现这个需求
重写下面这个方法,来验证输入的有效性
override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
if partialString.isEmpty {
return true
}
if partialString.count > 13{
return false
}
return Int(partialString.replacingOccurrences(of: " ", with: "")) != nil
}
初始化方法,配置了一些基本的格式信息:
private func basicInit() {
format = "###,####,####"
groupingSeparator = " "
isLenient = true
}
为了在输入过程中就自动分组,我实现了 TextField 的代理,重写了文本已经改变的方法:
func controlTextDidChange(_ obj: Notification) {
if let phoneTextFiled = obj.object as? NSTextField {
if phoneNumberTextField == phoneTextFiled {
_ = phoneTextFiled.stringValue
}
}
}
上面的方法只是读取了下最新的值,并没有使用。如果我不去访问值,就不会触发实时分组,我也不知道为何,所以就这么写了。
至于如何校验字符串是不是手机号,宽泛一些用正则表达式来进行处理:
static func isLegalForPhoneNumber(phoneNumerStr:String)->Bool{
let phoneStr = phoneNumerStr.replacingOccurrences(of: " ", with: "")
guard phoneNumerStr.count > 0 else {
return false
}
// - 1、创建规则
let pattern1 = "1[0-9]{10}"
// - 2、创建正则表达式对象
let regex1 = try! NSRegularExpression(pattern: pattern1, options: NSRegularExpression.Options.caseInsensitive)
// - 3、开始匹配
let res = regex1.matches(in: phoneStr, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, phoneStr.count))
// 输出结果
return res.count > 0
}