ios - swift 。设置文本字段中输入的格式

标签 ios swift uitextfield uitextview number-formatting

我创建了文本字段,并希望将其中的文本格式设置为 43/35。号码/号码 - 信用卡月份和年份。

我可以使用数字格式器吗?或者我怎样才能更轻松地做到这一点? 这里的问题是,如果添加新字符,我需要替换第三个字符;如果删除第二个字符,我需要删除它。

我不想使用任何第三方库,我需要 native 实现

最佳答案

这是我当前的解决方案。基本上你需要:

1) 在某处实现 textfielddelegate(在下面的代码中,我在 ViewController 上实现)

2) 实现 textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool

为了应用掩码,我为字符串和字符创建了一些扩展,如以下代码末尾所示:

class ViewController: UIViewController {
    @IBOutlet weak var textfield: UITextField!

    let mask = "##/##"

    override func viewDidLoad() {
        super.viewDidLoad()
        textfield.delegate = self
    }
}


extension ViewController: UITextFieldDelegate {
    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard let normalText = textField.text else { return false }

        let beginning = textField.beginningOfDocument
        // save cursor location
        let cursorLocation = textField.positionFromPosition(beginning, offset: range.location + string.characters.count)

        let newString = (normalText as NSString).stringByReplacingCharactersInRange(range, withString: string)
        let newStringClean = newString.stringWithOnlyNumbers().withMask(mask)

        guard newString != newStringClean else { return true }

        textField.text = newStringClean
        guard string != "" else { return false } 

        // fix cursor location after changing textfield.text
        if let cL = cursorLocation {
            let textRange = textField.textRangeFromPosition(cL, toPosition: cL)
            textField.selectedTextRange = textRange
        }

        return false
    }
}

extension String {
    func stringWithOnlyNumbers() -> String {
        return self.characters.reduce("") { (acc, c) -> String in
            guard c.isDigit() else { return acc }
            return "\(acc)\(c)"
        }
    }

    func withMask(mask: String) -> String {
        var resultString = String()

        let chars = self.characters
        let maskChars = mask.characters

        var stringIndex = chars.startIndex
        var maskIndex = mask.startIndex

        while stringIndex < chars.endIndex && maskIndex < maskChars.endIndex {
            if (maskChars[maskIndex] == "#") {
                resultString.append(chars[stringIndex])
                stringIndex = stringIndex.successor()
            } else {
                resultString.append(maskChars[maskIndex])
            }
            maskIndex = maskIndex.successor()
        }

        return resultString
    }

}

extension Character {
    func isDigit() -> Bool {
        let s = String(self).unicodeScalars
        let uni = s[s.startIndex]

        let digits = NSCharacterSet.decimalDigitCharacterSet()
        let isADigit = digits.longCharacterIsMember(uni.value)

        return isADigit
    }
}

关于ios - swift 。设置文本字段中输入的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40230392/

相关文章:

ios - 如何将参数传递给 Swift 中的函数?调用中缺少参数

ios - 如何在 UIPageViewController iOS Swift 3 中更改页面后进行小摇晃

ios - 在 Parse Cloud Code 中为对象设置 PFFile

iphone - 删除 uitextfield 开头的空白

iphone - 如果未安装 Facebook 原生应用,请打开 Facebook i safari

iphone - 一个屏幕上的两个 UIViewControllers 没有 SplitViewController

ios - 如何让我的应用程序忽略特定触摸?

ios - 上传 map 信息到 Firebase - iOS Swift

ios - 如何在表格 View 单元格中快速处理多个文本字段

ios - UITextField-在文本溢出时删除椭圆