2017-08-17 17 views
0

假设我有一个文本字段,需要分钟和小时作为输入。现在我怎么能限制文本字段小时只能到24和分钟字段为60.我如何限制小时和秒的文本字段?

+0

在'UITextFieldDelegate'方法'didEndEditing'方法添加了检查,并检查这些值 –

+0

一些提示更....我知道这一点,但不能创建的想法如何检查 –

+0

您只使用一个'的UITextField '或者其中两个? –

回答

1

文本字段的内容可以通过它的委托方法进行控制,包括询问是否为shouldChangeCharacters。如果用户输入的内容超出范围,则可以通过返回false来纠正,甚至不允许。

但一个好的用户界面的做法是不让用户犯错误开始。这就是pickers的原因。

0

让您的ViewController类符合UITextFieldDelegate协议,设置minuteField.delegate = selfhourField.delegate = self,然后实现shouldChangeCharactersIn range功能,并检查输入数字和< = 2.可以使用didEndEditing的字符数,检查数在你预期的范围内。

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

@danh你说得对,我错了。测试我的代码并纠正它,现在它工作正常。 –

+0

它更好 - 你正在测试添加的字符串是否包含数字。 OP旨在限制整个输入的数值。更彻底的方法是根据当前文本形成一个字符串,并且范围被改变......'textField.text.stringByReplacingCharactersInRange:withString'。 (请记住,用户可能会在字段中的任何地方粘贴文本)。测试候选输入的有效性(例如,如果它的intValue <60,或其他)。 – danh