iOS
UITextField-delegat
Sök…
UITextField - Begränsa textfältet till vissa tecken
Om du vill utföra en användarinmatningsvalidering av ditt textfält använder du följande kodavsnitt:
// 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];
}
Dessutom kan du använda teckenuppsättningar från apple för att utföra validering:
Titta på https://developer.apple.com/reference/foundation/nscharacterset
let allowedCharacters = CharacterSet.alphanumerics.inverted
let allowedCharacters = CharacterSet.capitalizedLetters.inverted
Hitta nästa tagg & Hantera tangentbord
Textfältet kallar olika delegatmetoder (endast om delegater är inställda) En av delegatmetoder som kallas av textfältet är * - (BOOL) textFieldShouldReturn: (UITextField ) textField
Denna metod kallas varje gång användarna trycker på returknappen. Genom att använda denna metod kan vi implementera alla anpassade beteenden.
Till exempel,
I exemplet nedan kommer nästa responder att ta reda på det med hjälp av taggen och hantera tangentbordet. Här är 20 konstanten, eftersom tagg som tilldelas textfält är så här 50,70,90 etc.
När du hittar ett nytt textfältobjekt som svarare kommer det att göra det aktuella textfältet som nytt responder och öppna tangentbordet i enlighet därmed.
- (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;
}
Åtgärder när en användare har börjat / slutat interagera med ett textfält
För Swift 3.1:
I det första exemplet kan man se hur man skulle fånga upp användaren som interagerar med ett textfält medan man skriver. På liknande sätt finns det metoder i UITextFieldDelegate som kallas när en användare har startat och avslutat sin interaktion med en TextField.
För att kunna komma åt dessa metoder måste du följa UITextFieldDelegate- protokollet, och för varje textfält som du vill bli meddelad om, tilldelar förälderklassen som delegat:
class SomeClass: UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
}
Nu kommer du att kunna implementera alla UITextFieldDelegate-metoder.
Om du vill bli meddelad när en användare har börjat redigera ett textfält kan du implementera textFieldDidBeginEditing (_ :) -metoden så:
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
}
}
På samma sätt kan du använda textFieldDidEndEditing (_ :) -metoden på så sätt att bli meddelad om en användare har avslutat interaktionen med ett textfält:
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
}
}
Om du vill ha kontroll över huruvida en TextField ska börja / avsluta redigering, kan textFieldShouldBeginEditing (_ :) och textFieldShouldEndEditing (_ :) -metoder användas genom att returnera true / false baserat på din logik som behövs.