Поиск…


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 на основе вашей необходимой логики.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow