禁止在Swift中使用字母字符3

时间:2017-04-26 14:15:22

标签: ios swift swift3

我是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()
}
}

3 个答案:

答案 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