iOS
UITextField Delegat
Szukaj…
UITextField - Ogranicz pole tekstowe do niektórych znaków
Jeśli chcesz przeprowadzić weryfikację pola tekstowego przez użytkownika, użyj następującego fragmentu kodu:
// 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
}
}
Cel 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];
}
Ponadto do sprawdzania poprawności możesz używać zestawów znaków dostarczonych przez firmę Apple:
Spójrz na https://developer.apple.com/reference/foundation/nscharacterset
let allowedCharacters = CharacterSet.alphanumerics.inverted
let allowedCharacters = CharacterSet.capitalizedLetters.inverted
Znajdź następny tag i zarządzaj klawiaturą
Pole tekstowe wywołuje różne metody delegowania (tylko jeśli ustawione są delegaty) Jedną z metod wywoływanych przez textfield jest * - (BOOL) textFieldShouldReturn: (UITextField ) textField
Ta metoda jest wywoływana za każdym razem, gdy użytkownik naciśnie przycisk powrotu. Za pomocą tej metody możemy zaimplementować dowolne niestandardowe zachowanie.
Na przykład,
W poniższym przykładzie kolejny respondent będzie znajdował się na podstawie tagu i zarządzał klawiaturą. Tutaj 20 jest stałą, ponieważ znacznik przypisany do pola tekstowego jest taki 50,70,90 itd.
Tutaj, po znalezieniu nowego obiektu pola tekstowego jako odpowiadającego, zmieni bieżące pole tekstowe jako nowego odpowiadającego i odpowiednio otworzy klawiaturę.
- (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;
}
Działania, gdy użytkownik rozpoczął / zakończył interakcję z polem tekstowym
W przypadku Swift 3.1:
W pierwszym przykładzie widać, jak przechwyciłbyś użytkownika wchodzącego w interakcje z polem tekstowym podczas pisania. Podobnie istnieją metody w UITextFieldDelegate, które są wywoływane, gdy użytkownik rozpoczął i zakończył swoją interakcję z TextField.
Aby uzyskać dostęp do tych metod, musisz być zgodny z protokołem UITextFieldDelegate i dla każdego pola tekstowego , o którym chcesz otrzymywać powiadomienia, przypisz klasę nadrzędną jako delegata:
class SomeClass: UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
}
Teraz będziesz mógł zaimplementować wszystkie metody UITextFieldDelegate.
Aby otrzymywać powiadomienia, gdy użytkownik rozpoczął edycję pola tekstowego , możesz zaimplementować metodę textFieldDidBeginEditing (_ :) w następujący sposób:
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
}
}
Podobnie, będąc powiadamianym, jeśli użytkownik zakończył interakcję z polem tekstowym , możesz użyć metody textFieldDidEndEditing (_ :) w następujący sposób:
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
}
}
Jeśli chcesz mieć kontrolę nad tym, czy TextField powinien rozpocząć / zakończyć edycję, metody textFieldShouldBeginEditing (_ :) i textFieldShouldEndEditing (_ :) mogą być używane przez zwracanie wartości true / false zgodnie z potrzebną logiką.