Mac OS 开发

限制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
    }
上一篇下一篇

猜你喜欢

热点阅读