我是Swift的新手,我正在阅读Big Nerd Ranch的书,以了解更多。我有一个应用程序,允许用户键入华氏温度然后将转换为摄氏度并显示在界面上。应用程序仅在摄氏标签上显示一个小数位。现在我想禁止用户输入字母字符。我一直试图弄清楚如何这样做,但我无法理解。任何帮助将非常感激。 到目前为止,这是我的代码:
import UIKit
class ConversionViewController : UIViewController , UITextFieldDelegate {
@IBOutlet var textField: UITextField!
@IBOutlet var celsiusLabel: UILabel!
var fahrenheitValue: Measurement<UnitTemperature>?
{
didSet {
updateCelsiusLabel()
}
}
var celsiusValue: Measurement<UnitTemperature>? {
if let fahrenheitValue = fahrenheitValue {
return fahrenheitValue.converted(to: .celsius)
} else {
return nil
}
}
func updateCelsiusLabel() {
if let celsiusValue = celsiusValue {
celsiusLabel.text = numberFormatter.string(from: NSNumber(value: celsiusValue.value))
} else {
celsiusLabel.text = "???"
}
}
let numberFormatter: NumberFormatter = {
let nf = NumberFormatter()
nf.numberStyle = .decimal
nf.minimumFractionDigits = 0
nf.maximumFractionDigits = 1
return nf
}()
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool {
let existingTextHasDecimalSeparator = textField.text?.range(of: ".")
let replacementTextHasDecimalSeparator = string.range(of: ".")
if existingTextHasDecimalSeparator != nil,
replacementTextHasDecimalSeparator != nil {
return false
} else {
return true
}
}
@IBAction func fahrenheitFieldEditingChanged(_ textField: UITextField) {
if let text = textField.text, let value = Double(text) {
fahrenheitValue = Measurement(value: value, unit: .fahrenheit)
} else {
fahrenheitValue = nil
}
}
@IBAction func dismissKeyboard(_ sender: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func viewDidLoad() {
super.viewDidLoad()
updateCelsiusLabel()
}
}
答案 0 :(得分:0)
你已经有了这个功能:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool
只需将其更改为使用以下内容返回false
:
for tempChar in string.unicodeScalars {
if tempChar.isAlpha() {
return false
}
}
答案 1 :(得分:0)
这是我的解决方案,它建立在本书的if语句之上,深入了解另一层。
if existingTextHasDecimalSeparator != nil && replacementTextHasDecimalSeparator != nil {
return false
}
else {
if CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: string)) || (string.range(of: ".") != nil) {
// If incoming character is a decimalDigit or a period, return true
return true
}
else {
// If a letter is detected, returns false
return false
}
}
答案 2 :(得分:-2)
您可以将UITextField的keyboardType设置为各种UIKeyboardTypes,这些类型将更改用户可用的输入选项。 Apple文档中列出了不同的键盘类型:https://developer.apple.com/reference/uikit/uikeyboardtype