阻止一些数字键盘的数字,使其适应用户输入。

Blocking some of number pad's numbers so that it is adapted to the user input.

我的应用要求用户输入精确的分钟数,she/he 使用数字键盘输入该分钟数。对于用户键入的第一个数字,我想阻止键盘的数字 > 5(这样他们就不能键入大于 59 的分钟数)。对于第二个号码,我希望它能取消阻止之前被阻止的号码,以便可以精确插入分钟(例如 18 或 59)。有没有办法做到这一点?如果是,怎么做?

你应该和 textField(_:shouldChangeCharactersIn:replacementString:) from the UITextFieldDelegate 一起工作。

这是您可以执行的操作的示例:

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

        var startString =  NSString()
        if textField.text != nil {
            startString = textField.text! as NSString
        }

        let endString = startString.stringByReplacingCharactersInRange(range, withString: string)

         if endString.isEmpty == true {
            return true
         }


        let intValue = Int(endString)
        if intValue >= 0 && intValue < 60 {
            return true
        }

        return false
    }

在这种情况下,它将允许 0(包括)和 60(不包括)之间的每个整数值。

编辑: 此方法由 UITextField 在其委托上调用(如果您不了解什么是委托,请花一些时间阅读 this and this,此模式非常重要)。

因此,要使上述方法有效,您只需告诉 UITextField 您的 UIViewController 是它的委托。您可以在代码中(例如在 viewDidLoad 中)或在 Interface Builder 中执行此操作。这是一个完整的示例:

class MyViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
    }

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

        var startString = NSString()
        if textField.text != nil {
            startString = textField.text! as NSString
        }

        let endString = startString.stringByReplacingCharactersInRange(range, withString: string)

         if endString.isEmpty == true {
            return true
         }    

        let intValue = Int(endString)
        if intValue >= 0 && intValue < 60 {
            return true
        }

        return false
    }
}