ios - 如何在 Swift 中的 UITextField 上应用手机号码模式
问题描述
我需要获取波斯语和英语的用户手机号码。并应用电话号码模式显示。 我找到了两个解决方案,每个都有一个问题。
1号:
extension String{
func applyPatternOnNumbers(pattern: String) -> String {
let replacmentCharacter: Character = "#"
var pure = self.replacingOccurrences( of: "[^۰-۹0-9]", with: "", options: .regularExpression)
for index in 0 ..< pattern.count {
guard index < pure.count else { return pure }
let stringIndex = String.Index.init(encodedOffset: index)
let patternCharacter = pattern[stringIndex]
guard patternCharacter != replacmentCharacter else { continue }
pure.insert(patternCharacter, at: stringIndex)
}
return pure
}
}
在编辑中使用已更改
class ViewController: UIViewController, UITextFieldDelegate {
let textField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
textField.frame = CGRect(x: 10, y: 50, width: 300, height: 50)
textField.delegate = self
textField.backgroundColor = UIColor.lightGray
textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
self.view.addSubview(textField)
}
@objc func editingChanged(){
let pattern = "+# (###) ###-####"
let mobile = textField.text
textField.text = mobile!.applyPatternOnNumbers(pattern: pattern)
}
}
当数字输入为英文时,例如 +1800444777,结果为
// +1 (800) 444-7777
但是当输入波斯数字时,例如 +10004447777,结果是这样的
// +۱ (۸۩ ´۷۷۷
2号:
extension String{
func applyPatternOnNumbers(pattern: String) -> String {
let replacmentCharacter: Character = "#"
let pureNumber = self.replacingOccurrences( of: "[^۰-۹0-9]", with: "", options: .regularExpression)
var result = ""
var pureNumberIndex = pureNumber.startIndex
for patternCharacter in pattern {
if patternCharacter == replacmentCharacter {
guard pureNumberIndex < pureNumber.endIndex else { return result }
result.append(pureNumber[pureNumberIndex])
pureNumber.formIndex(after: &pureNumberIndex)
} else {
result.append(patternCharacter)
}
}
return result
}
}
使用此方法与上一个方法相同此方法适用于英语和波斯语
英语“+1800444777”结果是//+1 (800) 444-7777
波斯语“+18000444777”结果是//+۱ (۸۰۰) ۴۴۴-۷۷۷۷
但问题是 space
& -
, (
, )
,+
字符在编辑时不能被删除textfield
解决方案
请将 2 号分机替换为以下内容:
extension String{
func applyPatternOnNumbers(pattern: String) -> String {
let replacmentCharacter: Character = "#"
let pureNumber = self.replacingOccurrences( of: "[^۰-۹0-9]", with: "", options: .regularExpression)
var result = ""
var pureNumberIndex = pureNumber.startIndex
for patternCharacter in pattern {
guard pureNumberIndex < pureNumber.endIndex else { return result }
if patternCharacter == replacmentCharacter {
result.append(pureNumber[pureNumberIndex])
pureNumber.formIndex(after: &pureNumberIndex)
} else {
result.append(patternCharacter)
}
}
return result
}
}
这个更新的代码检查是否pureNumberIndex
到达最后,比前一个版本早一点。
随着这种变化,pattern
需求以replacmentCharacter
. 我希望您列出的所有模式都以"#"
.
推荐阅读
- ios - iOS ViewController 加载异步(HealthKit)数据的正确架构
- sql - 雪花中 SQL MERGE 语句的结构?
- swift - 投射一些类型
到 SomeType 在斯威夫特 - javascript - 如何在不使用主机系统的日期和时间的情况下获取当前日期
- flutter - Flutter - FlatButton 填充可用水平空间
- c++ - 为什么 const 容器可以保存 const 引用?
- java - 有没有办法让它在我的代码中输出结果的值?
- http - HttpServletResponse getWriter() 写函数几天后开始抛出空指针异常?
- javascript - django 使用一个 url 运行自定义视图类方法
- c++ - 无法在具有自定义运算符 ==() 的 c++ 无序集中找到用户定义的类型