Domanda

Ho un UITextField nella mia applicazione. Vorrei limitare l'insieme di caratteri che possono essere inseriti nel campo a un insieme che ho definito. Potrei filtrare i caratteri inseriti nel campo quando il testo viene eseguito il commit con il metodo UITextFieldDelegate:

- (BOOL)textFieldShouldReturn:(UITextField*)textField

Tuttavia, ciò dà all'utente una falsa impressione poiché, sebbene i caratteri limitati vengano rimossi dal valore finale, erano ancora visibilmente inseriti nel campo di testo prima di premere Return / Done / etc. Qual è l'approccio migliore che impedirebbe la visualizzazione di caratteri con restrizioni nel campo di testo quando vengono selezionati sulla tastiera?

Nota: sto operando supponendo di avere un controllo limitato su quali tasti sono forniti dalla tastiera o dalle tastiere dell'iPhone. Sono consapevole di poter passare da una tastiera all'altra, ma ho l'impressione di non poter disabilitare tasti specifici. Questa ipotesi potrebbe non essere corretta.

È stato utile?

Soluzione

Guarda textField: shouldChangeCharactersInRange

Questo metodo viene chiamato da UITextFieldDelegate ogni volta che vengono digitati nuovi caratteri o vengono eliminati caratteri esistenti dal campo di testo. È possibile restituire NO per non consentire la modifica.

Altri suggerimenti

Ho fatto come suggerito marcc e ha funzionato bene. Segue l'implementazione di esempio.

Nota: i nomi delle variabili sono stati selezionati per brevità e non riflettono i miei standard di codifica:

    ...
    myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"xyzXYZ"];
    ...
}

- (BOOL) textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)textEntered {
    for (int i = 0; i < [textEntered length]; i++) {
        unichar c = [textEntered characterAtIndex:i];
        if (![myCharSet characterIsMember:c]) {
            return NO;
        }
    }
    return YES;
}

Ecco uno degli approcci più chiari per limitare i caratteri inseriti in un UITextField. Questo approccio consente l'uso di più NSCharacterSet predefiniti.

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSMutableCharacterSet *allowedCharacters = [NSMutableCharacterSet alphanumericCharacterSet];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]];
    [allowedCharacters formUnionWithCharacterSet:[NSCharacterSet symbolCharacterSet]];

    if([string rangeOfCharacterFromSet:allowedCharacters.invertedSet].location == NSNotFound){

        return YES;

    }

    return NO;

}

Guarda il metodo UITextViewDelegate - (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range changeString: (NSString *) string .

È esattamente ciò di cui hai bisogno.

Questo è ciò che uso per limitare l'utente alla maiuscola dalla A alla Z. Regola la variabile regex secondo il gusto:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^A-Z]";
    return ([string rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

Che ne dici di questo?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSString* regex = @"[^a-z]";
    return ([[string lowercaseString] rangeOfString: regex
                      options:NSRegularExpressionSearch].location == NSNotFound);
};

Nota:

Sto creando tutti i caratteri in minuscolo [string minuscoleString] in modo che non sia necessario scrivere in regex per lettere maiuscole / minuscole.

È possibile eseguire il ciclo continuo e verificare se la proprietà UITextField.text è cambiata dopo la chiamata al metodo DidBeginEditing. In tal caso, controlla il testo e rimuovi i caratteri errati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top