2017-08-17 3 views
0

私は入力として分と時間を取るテキストフィールドがあるとします。今では、テキストフィールドを24時間に制限し、分フィールドを60に制限することができます。テキストフィールドを1時間と2時間に制限する方法を教えてください。

+0

私はこのことを知っていますが、一つだけ 'のUITextFieldを使用しているか –

+0

いくつかのヒントをご確認くださいそれとも2つ? –

+0

をチェックするためにアイデアを作成することはできません....あなた' UITextFieldDelegate'方法 'didEndEditing'の方法でチェックを追加し、さらにそれらの値に –

答えて

1

テキストフィールドの内容は、shouldChangeCharactersかどうかを尋ねるメソッドを含めて、委譲メソッドで制御できます。ユーザーが範囲外に何かを入力した場合は、それを訂正するか、またはfalseを返すことで禁止することもできます。

しかし、UIの優れた習慣は、ユーザーが最初にエラーを起こさせないようにすることです。それがpickersの理由です。

0

すると、あなたのViewControllerクラスがUITextFieldDelegateプロトコルに準拠してください、minuteField.delegate = selfhourField.delegate = selfを設定し、その後、shouldChangeCharactersIn range機能を実装し、入力が数値であることを確認し、あなたがdidEndEditingを使用することができます< = 2文字の数は数いることを確認することあなたの予想される範囲にあります。

extension VC: UITextFieldDelegate { 
    func textFieldDidEndEditing(_ textField: UITextField) { 
     if textField == minuteField { 
      guard let minuteText = textField.text, let minutes = Int(minuteText) else {return} 
      if minutes < 0 || minutes > 60 { 
       textField.text = "" 
      } 
     } else if textField == hourField { 
      guard let hourText = textField.text, let hours = Int(hourText) else { return } 
      if hours < 0 || hours > 24 { 
       textField.text = "" 
      } 
     } 
    } 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
     if string.isEmpty { 
      return true 
     } else if string.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) != nil { 
      return false 
     } else if let numberOfChars = textField.text?.characters.count, numberOfChars >= 2 { 
      return false 
     } else { 
      return true 
     } 
    } 
} 
+0

正しくはないと思います。置換(stringByReplacingOccurancesInRange)の後にテキスト*が何であるかを最初に計算してから、その文字列が有効であるかどうかをテストする必要があります。 – danh

+0

@ダン、あなたは正しい、私は間違っていた。私のコードをテストして修正しました。今は正しく動作しています。 –

+0

追加された文字列に数字が含まれているかどうかをテストしている方が良いです。 OPは、入力全体の数値を制限することを目指しています。より徹底的なアプローチは、現在のテキストと範囲を変更して文字列を作成することです。 'textField.text.stringByReplacingCharactersInRange:withString'。 (ユーザーがフィールド内の任意の場所にテキストを貼り付ける可能性があることに注意してください)。入力候補の有効性をテストします(たとえば、そのintValue <60など)。 – danh

関連する問題