编辑时Swift-文本字段格式更新

时间:2015-03-22 16:24:20

标签: uitableview swift core-data uitextfield

我有一个将文本字段格式化为电话号码的功能,但此功能仅在我保存托管对象上下文后才起作用。例如,我有一个UITableView,其中包含用于文本字段的静态单元格作为联系表单。当我创建一个新联系人时(在我保存联系人之前),电话号码的文本字段不会被我的功能格式化,但在我保存该联系人并重新打开它之后,请输入一个电话号码格式正确。我试图找出这是为什么,以及我做了什么,以便在任何一种情况下数字格式化。这是我用来格式化电话号码的功能。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        if textField == phoneTxt {
            var newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
            var components = newString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet)
            var decimalString = "".join(components) as NSString
            var length = decimalString.length
            var hasLeadingOne = length > 0 && decimalString.characterAtIndex(0) == (1 as unichar)

            if length == 0 || (length > 10 && !hasLeadingOne) || length > 11 {
                var newLength = (textField.text as NSString).length + (string as NSString).length - range.length as Int

                return (newLength > 10) ? false : true
            }
            var index = 0 as Int
            var formattedString = NSMutableString()

            if hasLeadingOne {
                formattedString.appendString("1 ")
                index += 1
            }
            if (length - index) > 3 {
                var areaCode = decimalString.substringWithRange(NSMakeRange(index, 3))
                formattedString.appendFormat("(%@) ", areaCode)
                index += 3
            }
            if length - index > 3 {
                var prefix = decimalString.substringWithRange(NSMakeRange(index, 3))
                formattedString.appendFormat("%@-", prefix)
                index += 3
            }

            var remainder = decimalString.substringFromIndex(index)
            formattedString.appendString(remainder)
            textField.text = formattedString
            return false
        } else {
            return true
        }
    }
`

1 个答案:

答案 0 :(得分:0)

当表单用于创建 new 对象时,您似乎没有设置文本字段的委托。在这种情况下,检查是否正在调用已发布的函数。