iOS
Участник UITextField
Поиск…
UITextField - ограничение текстового поля на определенные символы
Если вы хотите выполнить проверку входных данных вашего текстового поля, используйте следующий фрагмент кода:
// MARK: - UITextFieldDelegate
let allowedCharacters = CharacterSet(charactersIn:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz").inverted
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let components = string.components(separatedBy: allowedCharacters)
let filtered = components.joined(separator: "")
if string == filtered {
return true
} else {
return false
}
}
Objective-C
#define ACCEPTABLE_CHARACTERS @"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
Кроме того, вы также можете использовать наборы символов, предоставляемые apple для проверки:
Взгляните на https://developer.apple.com/reference/foundation/nscharacterset
let allowedCharacters = CharacterSet.alphanumerics.inverted
let allowedCharacters = CharacterSet.capitalizedLetters.inverted
Найти следующий тег и управлять клавиатурой
Текстовое поле вызывает разные методы делегатов (только если заданы делегаты). Один из методов делегата, вызванный текстовым полем, - * - (BOOL) textFieldShouldReturn: (UITextField ) textField
Этот метод вызывается всякий раз, когда пользователи нажимают кнопку возврата. Используя этот метод, мы можем реализовать любое пользовательское поведение.
Например,
В приведенном ниже примере следующий ответчик будет обнаружен на основе тега и управления клавиатурой. Здесь 20 - константа, так как тег, назначенный текстовому полю, подобен этому 50,70,90 и т. Д.
Здесь, при поиске нового объекта текстового поля в качестве ответчика, он сделает текущее текстовое поле новым ответчиком и открытой клавиатурой соответственно.
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSInteger nextTag = textField.tag+20;
// Try to find next responder
UIResponder *nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder)
{
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
}
else
{
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return YES;
}
Действия, когда пользователь начал / закончил взаимодействие с текстовым полем
Для Swift 3.1:
В первом примере можно увидеть, как вы будете перехватывать пользователя, взаимодействующего с текстовым полем во время записи. Аналогично, в UITextFieldDelegate есть методы, которые вызывается , когда пользователь начал и закончил свое взаимодействие с TextField.
Чтобы иметь доступ к этим методам, вам необходимо соответствовать протоколу UITextFieldDelegate , и для каждого текстового поля , о котором вы хотите получить уведомление, назначьте родительский класс в качестве делегата:
class SomeClass: UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
}
Теперь вы сможете реализовать все методы UITextFieldDelegate.
Чтобы получать уведомление, когда пользователь начал редактировать текстовое поле, вы можете реализовать метод textFieldDidBeginEditing (_ :) :
func textFieldDidBeginEditing(_ textField: UITextField) {
// now you can perform some action
// if you have multiple textfields in a class,
// you can compare them here to handle each one separately
if textField == emailTextField {
// e.g. validate email
}
else if textField == passwordTextField {
// e.g. validate password
}
}
Точно так же, будучи уведомленным, если пользователь закончил взаимодействие с текстовым полем , вы можете использовать метод textFieldDidEndEditing (_ :) :
func textFieldDidEndEditing(_ textField: UITextField) {
// now you can perform some action
// if you have multiple textfields in a class,
// you can compare them here to handle each one separately
if textField == emailTextField {
// e.g. validate email
}
else if textField == passwordTextField {
// e.g. validate password
}
}
Если вы хотите контролировать, нужно ли TextField начинать / заканчивать редактирование, методы textFieldShouldBeginEditing (_ :) и textFieldShouldEndEditing (_ :) могут использоваться путем возврата true / false на основе вашей необходимой логики.