2017-04-26 4 views
0

나는 스위프트에 익숙하지 않고 현재 더 큰 괴물 목장을 읽고 더 많은 것을 이해하고 있습니다. 나는 사용자가 화씨로 온도를 입력 할 수있게하는 응용 프로그램을 가지고 있으며 섭씨로 변환되어 인터페이스에 표시됩니다. 응용 프로그램에서는 섭씨 레이블에 한 자리 숫자 만 표시합니다. 이제 사용자가 알파벳 문자를 입력하지 못하도록하고 싶습니다. 나는 그렇게하는 법을 알아 내려고 노력했지만 그 아이디어를 얻을 수 없었다. 어떤 도움이라도 대단히 감사 할 것입니다.스위프트에서 알파벳 문자 금지 3

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() 
} 
} 
+1

체크 아웃이 질문에 http://stackoverflow.com/questions/12944789/allow-only-numbers-for-uitextfield-input을. –

+0

http://stackoverflow.com/a/29783546/2303865 –

답변

-2

당신은 사용자가 사용할 수있는 입력 옵션을 변경합니다 다양한 UIKeyboardTypes에의 UITextField의 keyboardType을 설정할 수 있습니다 여기에 지금까지 내 코드입니다. 이미 기능이 https://developer.apple.com/reference/uikit/uikeyboardtype

+0

사용자는 외부 키보드 또는 복사하여 붙여 넣기를 사용할 수 있습니다. – Sulthan

+0

여기에는 많은 제한이 있으며 누군가 다른 텍스트를 텍스트 필드에 붙여 넣지 못하게하지 않습니다. – rmaddy

0

:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange,replacementString string: String) -> Bool 

간단히 변경하여 false을 반환을이 : 서로 다른 키보드 유형은 여기에 애플의 문서에 나와있는

for tempChar in string.unicodeScalars { 
    if tempChar.isAlpha() { 
     return false 
    } 
} 
+0

목표는 사용자가 10 진수 만 입력 할 수있게하는 것이므로 더 나은 검사는 숫자와 적절한 소수 구분 기호 만 허용하는 것입니다. 단순히 문자를 허용하지 않으면 다른 많은 잘못된 문자가 허용됩니다. – rmaddy

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 
    } 
} 
관련 문제