swift - fields - text field ios 11
¿Cómo restringir ciertos caracteres en UITextField en Swift? (6)
Estoy creando una aplicación de preguntas y respuestas que solicita un nombre de usuario al inicio. Me gustaría imposibilitar el uso de caracteres como # $ @! ^ & Etc (también incluido "espacio"). Eché un vistazo a este post aquí, pero está escrito completamente en Objective-C. Gracias por adelantado.
Como explícitamente está pidiendo Swift, he traducido la respuesta superior en la pregunta vinculada.
let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
func textField(
textField: UITextField,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String)
-> Bool
{
let set = NSCharacterSet(charactersInString: notAllowedCharacters);
let inverted = set.invertedSet;
let filtered = string
.componentsSeparatedByCharactersInSet(inverted)
.joinWithSeparator("");
return filtered != string;
}
internal func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{
if let text = string{
if text == "#" || text == "$" || text == "!"{ //and so on
return false
}
}
return true
}
Swift 2.3
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let characters = ["#", "$", "!", "&","@"]
for character in characters{
if string == character{
print("This characters are not allowed")
return false
}
}
}
Swift: 3 y un enfoque diferente:
Agregue una función de destino para el cambio del campo de texto en su viewDidLoad:
override func viewDidLoad() {
super.viewDidLoad()
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(textField:)), for: UIControlEvents.editingChanged)
}
en la función de destino, simplemente detecte el carácter introducido y reemplácelo con un espacio en blanco. Lo he probado y evita que el usuario ingrese caracteres no deseables en el campo de texto.
func textFieldDidChange(textField: UITextField) {
if let textInField = textField.text{
if let lastChar = textInField.characters.last{
//here include more characters which you don''t want user to put in the text field
if(lastChar == "*")
{
textField.text = textInField.substring(to: textInField.index(before: textInField.endIndex))
}
}
}
}
Agregando a lo que dijo @Evdzhan Mustafa. Desea agregar una declaración de devolución en caso de que la cadena esté vacía. Sin él, no podrás borrar tu texto. Código modificado a continuación:
Versión de Swift 3
let notAllowedCharacters = " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.";
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.isEmpty{
return true
}
print("String: /(string)")
let set = NSCharacterSet(charactersIn: notAllowedCharacters);
let inverted = set.inverted;
let filtered = string.components(separatedBy: inverted).joined(separator: "")
print("String Filtered: /(filtered)")
return filtered != string;
}
Esta es probablemente la forma más robusta de restringir los espacios . El uso de este usuario no podrá Pegar / Escribir espacios en blanco
Así es como puedes implementar usando Swift 3 .
Agregue el fragmento de extension
mencionado a continuación a un archivo Swift;
extension String {
var containsWhitespace: Bool {
for scalar in unicodeScalars {
switch scalar.value {
case 0x20:
return true
default:
continue
}
}
return false
}
}
En su archivo ViewController
Swift, arrastre su Instancia modificada de edición y una Salida de referencia de UITextField
desde Storyboard, el mencionado en la imagen a continuación:
Use las instancias arrastradas como se menciona a continuación:
Hacer referencia a Outlet como:
@IBOutlet weak var textField: UITextField!
y Edición Modificada como:
@IBAction func textChanged(_ sender: UITextField) {
if (textField.text!.containsWhitespace) == true {
print("Restrict/Delete Whitespace")
emailField.deleteBackward()
} else {
print("If Its not Whitespace, Its allowed.")
}
}
Esto detectará y eliminará el espacio en blanco tan pronto como el usuario intente escribirlo / pegarlo .