In che modo è possibile consentire l'immissione di soli caratteri alfanumerici in un iOS UITextField
?Consenti solo caratteri alfanumerici per un UITextField
risposta
Utilizzare il metodo UITextFieldDelegate -textField:shouldChangeCharactersInRange:replacementString:
con un NSCharacterSet contenente l'inverso dei caratteri che si desidera consentire. Per esempio:
// in -init, -initWithNibName:bundle:, or similar
NSCharacterSet *blockedCharacters = [[[NSCharacterSet alphanumericCharacterSet] invertedSet] retain];
- (BOOL)textField:(UITextField *)field shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)characters
{
return ([characters rangeOfCharacterFromSet:blockedCharacters].location == NSNotFound);
}
// in -dealloc
[blockedCharacters release];
Nota che avrete bisogno di dichiarare che la classe implementa il protocollo (cioè @interface MyClass : SomeSuperclass <UITextFieldDelegate>
) e impostare il delegate
all'istanza della classe campo di testo.
Questo è come lo faccio:
// Define some constants:
#define ALPHA @"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
#define NUMERIC @"1234567890"
#define ALPHA_NUMERIC ALPHA NUMERIC
// Make sure you are the text fields 'delegate', then this will get called before text gets changed.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// This will be the character set of characters I do not want in my text field. Then if the replacement string contains any of the characters, return NO so that the text does not change.
NSCharacterSet *unacceptedInput = nil;
// I have 4 types of textFields in my view, each one needs to deny a specific set of characters:
if (textField == emailField) {
// Validating an email address doesnt work 100% yet, but I am working on it.... The rest work great!
if ([[textField.text componentsSeparatedByString:@"@"] count] > 1) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".-"]] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:[ALPHA_NUMERIC stringByAppendingString:@".!#$%&'*+-/=?^_`{|}[email protected]"]] invertedSet];
}
} else if (textField == phoneField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:NUMERIC] invertedSet];
} else if (textField == fNameField || textField == lNameField) {
unacceptedInput = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
} else {
unacceptedInput = [[NSCharacterSet illegalCharacterSet] invertedSet];
}
// If there are any characters that I do not want in the text field, return NO.
return ([[string componentsSeparatedByCharactersInSet:unacceptedInput] count] <= 1);
}
Scopri i UITextFieldDelegate Reference troppo.
Questo è veramente utile. L'unica cosa che ho aggiunto è stata 'if (([string isEqualToString: @" @ "]) && (range.location == 0)) {unacceptedInput = [NSCharacterSet characterSetWithCharactersInString: @" @ "]; } all'interno del ramo Campo email per impedire a @ di essere utilizzato per avviare un indirizzo email – Ryan
Si dovrà utilizzare i textField delegate
metodi e utilizzare metodi textFieldDidBeginEditing
, shouldChangeCharactersInRange
e textFieldDidEndEditing
per controllare i personaggi.
Fare riferimento a this link per la documentazione.
ho trovato una risposta semplice e di lavoro e voglio condividere:
collegare l'UITextField per l'evento EditingChanged al seguente IBAction
-(IBAction) editingChanged:(UITextField*)sender
{
if (sender == yourTextField)
{
// allow only alphanumeric chars
NSString* newStr = [sender.text stringByTrimmingCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]];
if ([newStr length] < [sender.text length])
{
sender.text = newStr;
}
}
}
+1 per la creatività – ArtOfWarfare
Una domanda: il confronto delle lunghezze è migliore del semplice confronto dei contenuti?A meno che la lunghezza non sia effettivamente memorizzata nell'oggetto NSString, immagino in entrambi i casi che il confronto prenda 'm + n' time, dove' m' è la lunghezza di 'newStr' e' n' è la lunghezza di 'sender.text '. – ArtOfWarfare
per SWIFT: Collegare l'UITextField per l'evento EditingChanged a seguire IBAction:
@IBAction func ActionChangeTextPassport(sender:UITextField){
if sender == txtPassportNum{
let newStr = sender.text?.stringByTrimmingCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet)
if newStr?.characters.count < sender.text?.characters.count{
sender.text = newStr
}
}
}
Swift 3 versione
Attualmente accettato approccio risposta:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Attempt to find the range of invalid characters in the input string. This returns an optional.
let range = string.rangeOfCharacter(from: invalidChars)
if range != nil {
// We have found an invalid character, don't allow the change
return false
} else {
// No invalid character, allow the change
return true
}
}
Un altro approccio altrettanto funzionale:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// Get invalid characters
let invalidChars = NSCharacterSet.alphanumerics.inverted
// Make new string with invalid characters trimmed
let newString = string.trimmingCharacters(in: invalidChars)
if newString.characters.count < string.characters.count {
// If there are less characters than we started with after trimming
// this means there was an invalid character in the input.
// Don't let the change go through
return false
} else {
// Otherwise let the change go through
return true
}
}
Il modo RegEx a Swift:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty {
return true
}
let alphaNumericRegEx = "[a-zA-Z0-9]"
let predicate = NSPredicate(format:"SELF MATCHES %@", alphaNumericRegEx)
return predicate.evaluate(with: string)
}
- 1. Test stringa di testo UITextField per contenere solo caratteri alfanumerici
- 2. Consenti solo caratteri alfanumerici nella casella di testo
- 3. ORDINA DI caratteri alfanumerici solo in SQLite
- 4. RegEx per includere caratteri alfanumerici e speciali
- 5. Controllare se NSString contiene alfanumerici + sottolineatura caratteri solo
- 6. Come rimuovere caratteri non alfanumerici?
- 7. Come verificare la presenza di caratteri alfanumerici
- 8. selezionare solo le righe che contengono solo caratteri alfanumerici in MySQL
- 9. Filtraggio dei caratteri immessi in un UITextField
- 10. Iphone UITextField solo intero
- 11. Come posso fare un campo di modulo Django contenere solo caratteri alfanumerici
- 12. UITextField nascondi tutti i caratteri
- 13. Regex per rimuovere caratteri non alfanumerici da stringhe UTF8
- 14. Come verificare se una stringa contiene solo caratteri alfanumerici nell'obiettivo C?
- 15. Restituisce le righe sql dove il campo contiene SOLO caratteri non alfanumerici
- 16. Come posso verificare se una stringa contiene solo caratteri alfanumerici e trattini?
- 17. Robots.txt: consenti solo i principali SE
- 18. Rimuovere tutti i caratteri non alfanumerici utilizzando preg_replace
- 19. Consenti solo numeri e punto nello script
- 20. Consenti solo numeri nella casella di testo in GWT?
- 21. Consenti richiesta proveniente solo da IP specifico
- 22. DataAnnotations - Disallow Numbers o consenti solo stringhe date
- 23. Swift - Consenti la rotazione solo su iPad
- 24. Consenti solo un'istanza di script python?
- 25. Consenti solo a determinati domini di poter caricare un iFrame
- 26. Consenti solo un utente-agente, blocca il resto in nginx?
- 27. Consenti solo alcune lettere, divieto caratteri speciali ($% etc.) ad eccezione di altri (' -)
- 28. Protezione di iFrame - Consenti solo di funzionare su un dominio
- 29. Espressione regolare PHP - Rimuovi tutti i caratteri non alfanumerici
- 30. Sostituisci tutti i caratteri non alfanumerici in una stringa
Intendi: return [caratteri rangeOfCharacterFromSet: blockedCharacters] .location == NSNotFound; – Sagiftw
Hai ragione, lo so. Grazie per la correzione. –
Un motivo particolare per cui è stato invertito il set di caratteri alfanumerici? Non è possibile rimuovere l'invertedSet e quindi modificare il test di ritorno su! = NSNotFound? Solo curioso visto che ho avuto qualche logica in là, oltre al ritorno – nbsp