Мое приложение запрашивает у пользователя точное количество минут, которое он вставляет с помощью клавиатуры с цифровым клавиатурой. Я хотел бы заблокировать номера клавиатуры> 5 для первого числа, которое пользователь вводит (чтобы они не могли набирать несколько минут> 59). Для второго номера я хотел бы, чтобы он разблокировал ранее заблокированные номера, чтобы минуты могли быть точно вставлены (например, 18 или 59). Есть ли способ сделать это? Если да, то как?Блокировка некоторых номеров номерной подушки так, чтобы она была адаптирована к пользовательскому вводу.
ответ
Вы должны работать с textField(_:shouldChangeCharactersIn:replacementString:)
от 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 (без НДС).
Edit: Этот метод вызывается UITextField
на его делегатом (если вы не понимаете, что такое делегат, потребуется некоторое время, чтобы прочитать this и this, эта модель очень важна).
Итак, чтобы сделать вышеописанный метод, просто скажите вашему UITextField
, что ваш делегат UIViewController
. Вы можете сделать это в коде (например, viewDidLoad
) или в Интерфейс 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
}
}
Как бы я тогда называть эту функцию? Я не знаю, что я должен писать. Благодарю. – Bossvanlindt
Я отредактировал свой ответ с информацией о делегации :) –
Прохладный спасибо. Теперь он не позволяет превышать номер 59. Однако по какой-то причине он не позволяет пользователю удалить самый первый номер (например, 5 в 53). Почему это так? И как это можно решить? Кстати, я думаю, что теперь я понимаю делегатов немного лучше. Благодарю. – Bossvanlindt
Вам нужно будет создать свой собственный вид ввода – Paulw11