美文网首页Mac OS 开发
限制NSTextField输入格式

限制NSTextField输入格式

作者: _我和你一样 | 来源:发表于2019-07-08 18:24 被阅读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
        }
    

    相关文章

      网友评论

        本文标题:限制NSTextField输入格式

        本文链接:https://www.haomeiwen.com/subject/nobahctx.html