【发布时间】:2014-12-30 16:01:07
【问题描述】:
我正在开发一个贷款应用程序,我正在努力弄清楚如何在用户输入后立即格式化文本字段。很高兴看到这一点,因为只要文本字段中有数字,就会计算输出。
在我的视图控制器中:
@IBOutlet var loanTextField: UITextField!
@IBOutlet var interestTextField: UITextField!
@IBOutlet var interestStepper: UIStepper!
@IBOutlet var termTextField: UITextField!
@IBOutlet var termStepper: UIStepper!
创建了代表来构造最大长度并在适用时允许小数:
var integerTextFieldDelegate = NumericTextFieldDelegate(maxLength: 2)
var loanTextFieldDelegate = NumericTextFieldDelegate(maxLength: 10, allowDecimal: true)
var interestRateTextFieldDelegate = NumericTextFieldDelegate(maxLength: 2, allowDecimal: true)
为 viewDidLoad 中的每个文本字段定义委托:
loanTextField.text = ""
loanTextField.delegate = loanTextFieldDelegate
interestRateTextField.setTextNumericValue(DefaultInterestRate)
interestRateTextField.delegate = interestRateTextFieldDelegate
termTextField.setTextNumericValue(DefaultTerm)
termTextField.delegate = interestRateTextFieldDelegate
NumericTextFieldDelegate 引用了一个扩展:
// Implementation of UITextFieldDelegate that prevents non-numeric characters
// from being entered in a numeric text field.
public class NumericTextFieldDelegate: NSObject, UITextFieldDelegate {
let maxLength: Int
let allowDecimal: Bool
public init(maxLength: Int, allowDecimal: Bool = false) {
self.maxLength = maxLength
self.allowDecimal = allowDecimal
}
public func textField(textField: UITextField!,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String!) -> Bool
{
let originalText: NSString = textField.text
let proposedText: NSString = originalText.stringByReplacingCharactersInRange(range, withString: string)
let proposedLength = proposedText.length
if proposedLength > maxLength {
return false
}
if allowDecimal {
if proposedLength > 0 && !isValidDoubleString(proposedText) {
return false
}
}
else {
if proposedLength > 0 && !isValidIntegerString(proposedText) {
return false
}
}
return true
}
}
我还有一个数字格式化扩展:
public extension Double {
var formatted: String {
let formatter = NSNumberFormatter()
formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
formatter.currencyGroupingSeparator?
formatter.minimumFractionDigits = 2
formatter.maximumFractionDigits = 2
return formatter.stringFromNumber(self)!
}
}
我的问题是由于我缺乏经验。如何使用我的扩展设置贷款($ 货币、2 位小数和分组分隔符)和利率(始终为 3 位小数,因为它以 1/8 为增量)的文本字段格式。我看到了其他的 shouldChangeCharactersInRange 方法,或者有一些空白的 UILabel 来显示格式化的文本……但鉴于我目前的设置,我不确定如何在 Swift 中执行此操作。感谢您提供任何有用的提示!
【问题讨论】:
标签: ios swift uitextfield nsnumberformatter uitextfielddelegate